黑马程序员技术交流社区

标题: 一些必会的基础算法题 [打印本页]

作者: 逆风TO    时间: 2020-3-31 10:41
标题: 一些必会的基础算法题
简单选择排序:
[JavaScript] 纯文本查看 复制代码
public class EasySelectSort {
    public static void main(String[] args) {
        int arr[]={1,4,6,8,2,5,3,7,9};
        System.out.println("数组排序前顺序:");
        for (int n:arr){
            System.out.print(n+" ");
        }

        //简单选择排序
        selectSort(arr);

        System.out.println("\n数组排序后顺序:");
        for (int n :arr){
            System.out.print(n+" ");
        }

    }
    //简单选择排序
    private static void selectSort(int[] arr){
        int position = 0;//无序序列中的第一个位置
        //外层循环确定有序区
        for (int i=0;i<arr.length;i++){  //数组下标从0开始
            position = i;
            int temp = arr;  //把序列中第一个位置暂时作为最小记录
            //内层循环确定无序区
            for (int j=i+1;j<arr.length;j++){//在无序区查找最小记录
                if (arr[j]<temp){ //若最小记录不在最终位置时则交换位置
                    temp = arr[j];
                    position = j;//此时无序序列中第一个位置
                }
            }
            //最小记录在最终位置时
            arr[position] = arr;
            arr=temp;
        }
    }
}

直接插入排序:
[JavaScript] 纯文本查看 复制代码
public class InsertSort {
    public static void main(String[] args) {
         int arr[] ={1,4,6,8,2,5,3,7,9};
        System.out.println("数组排序前顺序:");
        for (int n:arr){
            System.out.print(n+"");
        }

    //直接插入排序
    insertSort(arr);

        System.out.println("\n数组排序后顺序:");
        for (int n:arr){
            System.out.print(n+" ");
        }
  }

    //直接插入排序
    public static void insertSort(int[] arr){
        //外层循环确定待比较数值
        for (int i=1;i<arr.length;i++){//必须i=1,因为开始从第二个数与第一个数进行比较
            int temp=arr;//待比较数值
            int j=i-1;
            //内层循环为待比较数值确定其最终位置
            for (;j>=0&&arr[j]>temp;j--){ //待比较数值比前一位置小,应插往前插一位
                //将大于temp的值整体后移一个单位
                arr[j+1]=arr[j];
            }
            arr[j+1]=temp;//待比较数值比前一位置大,最终位置无误
        }
    }
}

堆排序:
[JavaScript] 纯文本查看 复制代码
public class HeapSort {
    public static void main(String[] args) {

[JavaScript] 纯文本查看 复制代码
    int arr[] = {1,4,6,8,2,5,3,7,9};
    System.out.println("数组排序前顺序:");
    for(int n : arr){
        System.out.print(n+" ");
    }

    //堆排序
    heapSort(arr);

    System.out.println("\n数组排序后顺序:");
    for(int n : arr){
        System.out.print(n+" ");
    }
}

//堆排序
private static void heapSort(int []arr){
    //1.构建大根堆
    for (int i=arr.length/2-1;i>=0;i--){//第一个非叶子结点下标i=arr.length/2-1
        //从第一个非叶子结点从下至上,从右至左调整结构
        adjustHeap(arr,i,arr.length);
    }
    //2.交换堆顶元素与末尾元素+调整堆结构
    for (int j=arr.length-1;j>0;j--){//堆末尾元素的下标j=arr.length-1,不能为0,因为它不能是堆顶元素
        //将堆顶元素与末尾元素进行交换
        int temp=arr[0];
        arr[0]=arr[j];
        arr[j]=temp;
        //重新对堆进行调整
        adjustHeap(arr,0,j);
    }
}

//调整大根堆(仅是调整过程,建立在大根堆已构建的基础上)
// arr: 要排序的序列(数组)
// i:   第一个非叶子结点下标
// n:   剩余序列的长度(需要调整的结点个数)

private static void adjustHeap(int []arr,int i,int n){

    int temp = arr;//先取出第一个非叶子结点(根节点)
    for(int k=i*2+1;k<n;k=k*2+1){//从i结点的左子结点开始,也就是2i+1处开始
        if(k+1<n && arr[k]<arr[k+1]){//如果左子结点小于右子结点,k指向右子结点(k+1,即2i+2)
            k++;
        }
        if(arr[k] > temp){//如果子节点大于父节点,将子节点值赋给父节点(不用进行交换)
            arr = arr[k];
            i = k;
        }else{
            break;
        }
    }
    arr = temp;//将temp值放到最终的位置

}

希尔排序:
[Java] 纯文本查看 复制代码
public class SheelSort {
    public static void main(String[] args) {

        int arr[]={1,4,6,8,2,5,3,7,9};
        System.out.println("数组排序前顺序:");
        for (int n:arr){
            System.out.println(n);
        }

        //希尔排序
        SheelSort(arr);

        System.out.println("\n数组排序后顺序:");
        for (int n:arr){
            System.out.println(n);
        }
    }

    //希尔排序
    private static void SheelSort(int[] arr){
        int i,j,temp,gap=1,len=arr.length;
        while (gap<len/3){
            gap=gap*3+1;
        }

        for (;gap>0;gap/=3){
            for (i=gap;i<len;i++){
                temp = arr;
                for (j=i-gap;j>=0&&arr[j]>temp;j-=gap){
                    arr[j+gap]=arr[j];
                }
                arr[j+gap]=temp;
            }
        }
    }
}


归并排序:

public class MergeSort {
    public static void main(String[] args) {

        int arr[] = {1,4,6,8,2,5,3,7,9};
        System.out.println("数组排序前顺序:");
        for(int n : arr){
            System.out.print(n+" ");
        }

        //归并排序
        int lower = 0;
        int upper = arr.length-1;
        mergeSort(arr, lower, upper);

        System.out.println("\n数组排序后顺序:");
        for(int n : arr){
            System.out.print(n+" ");
        }

    }

    //归并排序
    private static void mergeSort(int[] arr, int lower, int upper) {

        if (lower < upper) {
            //找出中间索引
            int middle = (lower + upper)/2;
            //对左边数组进行递归
            mergeSort(arr, lower, middle);  //注意:此处和快速排序不一样,middle不需要减1,组成一个完整序列的下标
            //对右边数组进行递归
            mergeSort(arr, middle+1, upper);
            //合并
            merge(arr, lower, middle, upper);
        }

    }

    //归并
    private static void merge(int[] arr, int lower, int middle, int upper) {

        int[] tempArr = new int[arr.length]; //建立一个中间数组
        int mid = middle + 1; // 第二个子序列的第一个下标
        int third = lower; //third记录中间数组的索引
        int temp = lower;

        while (lower <= middle && mid <= upper) {
            //从两个数组中取出最小的放入中间数组
            if (arr[lower] <= arr[mid]) {
                tempArr[third++] = arr[lower++];
            } else {
                tempArr[third++] = arr[mid++];
            }
        }

        //剩余部分依次放入中间数组
        while (mid <= upper) {
            tempArr[third++] = arr[mid++];
        }

        while (lower <= middle) {
            tempArr[third++] = arr[lower++];
        }

        //将中间数组中的内容复制回原数组
        while (temp <= upper) {
            arr[temp] = tempArr[temp++];
        }

    }
}

基数排序:
[Java] 纯文本查看 复制代码
public class JiShuSort {
    public static void main(String[] args) {

        int arr[] = {1,4,6,8,2,5,3,7,9};
        System.out.println("数组排序前顺序:");
        for(int n : arr){
            System.out.print(n+"");
        }

        //基数排序
        radixSort(arr);

        System.out.println("\n数组排序后顺序:");
        for (int n:arr){
            System.out.print(n+"");
        }
    }

    //基数排序
    private static void radixSort(int[] arr){

        //首先确定排序的趟数
        int max=arr[0];
        for (int i=1;i<arr.length;i++){
            if (arr>max){
                max=arr;
            }
        }
        int time=0;
        //判断位数
        while (max>0){
            max/=10;
            time++;
        }

        //建立10个List集合
        List<List<Integer>> list=new ArrayList<List<Integer>>();
        for (int i=0;i<10;i++){
            List<Integer> list1 = new ArrayList<Integer>();
            list.add(list1);
        }

        //进行time次分配和收集
        for (int i=0;i<time;i++){
            //分配数组元素
            for (int n:arr){
                //得到数字的第time+1位数
                int x=n%(int)Math.pow(10,i+1)/(int)Math.pow(10,i);
                List<Integer> list2=list.get(x);
                list2.add(n);
                list.set(x,list2);
            }

            int count =0;//元素计数器
            //收集队列元素
            for (int k=0;k<10;k++){
                while(list.get(k).size()>0){
                    List<Integer> list3=list.get(k);
                    arr[count] = list3.get(0);
                    list3.remove(0);
                    count++;
                }
            }
        }
    }
}


转自CSDN

作者: 1467584    时间: 2020-4-7 10:21
66666666666666666666666666
作者: kdhdjdj    时间: 2020-4-7 10:21
6666666666666666666666666666666666666666666666
作者: 1467584    时间: 2020-4-7 10:21
6666666666666666666666666666
作者: 王锦    时间: 2020-4-7 10:27

作者: 你不爱我    时间: 2020-4-7 10:42
厉害了                     
作者: 逆风TO    时间: 2020-4-7 10:56
感谢分享  棒棒哒
作者: sdjadyhm    时间: 2020-4-7 10:56
666666666666666
作者: 我是小圆圆    时间: 2020-4-7 11:01
可以的,奥利给!!!
作者: hongping    时间: 2020-4-7 11:10

感谢分享  棒棒哒
作者: hongping    时间: 2020-4-7 11:12

感谢分享  棒棒哒
作者: daoqin    时间: 2020-4-7 11:27

可以的,奥利给!!!
作者: 哦嗨呦    时间: 2020-4-7 11:30
好人一生平安
作者: Emmmmm~    时间: 2020-4-7 11:36


                                                                                                  
键盘敲烂,月薪过万
作者: 孙丽    时间: 2020-4-7 11:51
66666666666666666666666
作者: manyihang    时间: 2020-4-7 14:47
666666666666
作者: jsnoob    时间: 2020-4-7 14:54
加油加油加油!!!
作者: 章鱼顶呱呱    时间: 2020-4-8 09:53
6666666666666666666
作者: 耙丫丫    时间: 2020-4-9 08:46
6666666666666666666666666
作者: lvxinvip    时间: 2020-4-9 09:21

作者: longyu3    时间: 2020-4-9 09:50
棒棒哒 加油 完美入行
作者: duanshaobo    时间: 2020-4-9 09:59
在这春暖花开的季节
作者: mydorling11    时间: 2020-4-9 10:01
666666666666666666666666666666
作者: 半个程序员    时间: 2020-4-9 14:03


可以的,奥利给!!!
作者: 举个栗子    时间: 2020-4-9 14:41
666666666666666666666666666666
作者: json0314    时间: 2020-4-9 14:50
加油哦.加油哦!
作者: 123木头人555    时间: 2020-4-9 15:19
6666666666666666666666666666
作者: 小公举    时间: 2020-4-9 15:28
6666666666666666666
作者: yujq    时间: 2020-4-9 18:22
66666666666666666
作者: 零度☆黎明    时间: 2020-4-9 23:14
66666666666666666666666666666666666666666666666666
作者: zplxwl    时间: 2020-4-10 00:31
666666666666666666666666
作者: 大智叔叔    时间: 2020-4-10 09:28

6666666666666666666666666
作者: 九月丫    时间: 2020-4-10 09:35
6666666666666666666666666666666666666666666666666
作者: lzq123    时间: 2020-4-10 09:36
666666666666666666666666666666666
作者: lzq123    时间: 2020-4-10 09:37
66666666666666666666666666666666666
作者: 我爱我1022    时间: 2020-4-10 09:38

作者: 我爱我1022    时间: 2020-4-10 09:38

作者: lzq123    时间: 2020-4-10 09:41
66666666666666666666666666666
作者: 竹竹竹竹    时间: 2020-4-10 10:05
666666666666666666666666666666666
作者: 影@子~    时间: 2020-4-10 10:06

作者: 王微    时间: 2020-4-10 10:16
666666666666666666666
作者: zhaosongzhi    时间: 2020-4-10 10:41
6666666666666666
作者: 霍尔    时间: 2020-4-10 10:54
66666666666666666666
作者: hello!!!    时间: 2020-4-10 11:07

作者: 黑马程序员啊    时间: 2020-4-10 12:58
6666666666666666666666666666666
作者: 雨落轻舟    时间: 2020-4-10 18:35
6666666666666666666666666666666666666666666666666666666666666666
作者: 素问    时间: 2020-4-12 22:13
谢谢分享,加油~~~~!!!!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2