常见排序算法代码总结(Java版)

Posted haq123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常见排序算法代码总结(Java版)相关的知识,希望对你有一定的参考价值。

学习自菜鸟教程,自己加以总结希望可以多多重复!!!

 

 1 //冒泡排序  O(n2)
 2     public static void BubbleSort(int[] arr){
 3         int temp;
 4         for(int i=0;i<arr.length-1;i++){
 5             for(int j=0;j<arr.length-1-i;j++){
 6                 if(arr[j]>arr[j+1]){
 7                     temp = arr[j];
 8                     arr[j] = arr[j+1];
 9                     arr[j+1] = temp;
10                 }
11             }
12         }
13     }
14 
15     //冒泡排序优化    O(n2)
16     public static void BubbleSort1(int[] arr){
17         int temp;
18         boolean flag;
19         for(int i=0;i<arr.length-1;i++){
20             flag = false;
21             for(int j=0;j<arr.length-1-i;j++){
22                 if(arr[j]>arr[j+1]){
23                     temp = arr[j];
24                     arr[j] = arr[j+1];
25                     arr[j+1] = temp;
26                     flag = true;
27                 }
28             }
29             if(!flag)
30                 break;
31         }
32     }

//选择排序  O(n2)
    public static void select_sort(int[] arr){
        int temp;
        for(int i=0;i<arr.length-1;i++){
            int minIndex = i;
            for(int j=i+1;j<arr.length;j++){
                if(arr[j]<arr[minIndex]){
                    minIndex = j;
                }
            }
            temp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = temp;
        }
    }

//插入排序  O(n2)
    public static void insert_sort(int[] arr){
        int temp;
        for(int i=0;i<arr.length-1;i++){
            for(int j=i+1;j>0;j--){
                if(arr[j]<arr[j-1]){
                    temp = arr[j];
                    arr[j] = arr[j-1];
                    arr[j-1] = temp;
                }else
                    break;
            }
        }
    }

//希尔排序
    public static void shell_sort(int[] arr){
        int temp;
        for(int step = arr.length/2;step>0;step/=2){//步长
            for(int i=0;i<step;i++){//划分子序列
                //插入排序
                for(int j=i+step;j<arr.length;j+=step){
                    for(int k=j;k>i;k-=step){
                        if(arr[k]<arr[k-step]){
                            temp = arr[k];
                            arr[k] = arr[k-step];
                            arr[k-step] = temp;
                        }else
                            break;
                    }
                }
            }
        }
    }

//快速排序
    public static void quick_sort(int[] arr,int low,int high){
        int i,j,temp,t;
        if(low>high){
            return;
        }
        i=low;
        j=high;
        //temp就是基准位
        temp = arr[low];
        while (i<j) {
            //先看右边,依次往左递减
            while (temp<=arr[j]&&i<j) {
                j--;
            }
            //再看左边,依次往右递增
            while (temp>=arr[i]&&i<j) {
                i++;
            }
            //如果满足条件则交换
            if (i<j) {
                t = arr[j];
                arr[j] = arr[i];
                arr[i] = t;
            }
        }
        //最后将基准为与i和j相等位置的数字交换
        arr[low] = arr[i];
        arr[i] = temp;
        //递归调用左半数组
        quick_sort(arr, low, j-1);
        //递归调用右半数组
        quick_sort(arr, j+1, high);
    }

//归并算法(逻辑)
    public static void merge_sort(int[] a,int first,int last,int[] temp){
        if(first<last){
            int middle = (first+last)/2;
            merge_sort(a,first,middle,temp);
            merge_sort(a,middle+1,last,temp);
            mergeArray(a,first,middle,last,temp);
        }
    }
    //归并算法实现
    public static void mergeArray(int[] a,int first,int middle,int end,int[] temp){
        int i = first;
        int m = middle;
        int j = middle + 1;
        int n = end;
        int k = 0;
        while (i<=m && j<=n){
            if(a[i]<=a[j]){
                temp[k] = a[i];
                i++;
            }else{
                temp[k] = a[j];
                j++;
            }
            k++;
        }
        while (i<=m){
            temp[k] = a[i];
            k++;
            i++;
        }
        while (j<=n){
            temp[k] = a[j];
            k++;
            j++;
        }
        for (int ii=0;ii<k;ii++){
            a[first+ii] = temp[ii];
        }
    }

//构造最小堆
    public static void makeMinHeap(int[] a,int n){
        for (int i=(n-1)/2;i>=0;i--){
            //从最后一个叶子节点的父亲开始构建
            minHeapFixDown(a,i,n);
        }
    }
    //最小堆调整
    public static void minHeapFixDown(int[] a,int i,int n){
        int j=2*i+1;
        int temp = 0;
        while (j<n){
            if(j+1<n && a[j+1]<a[j]){
                j++;
            }
            //父节点比最小子节点还小
            if(a[i] <= a[j]){
                break;
            }
            //较大节点下移
            temp = a[i];
            a[i] = a[j];
            a[j] = temp;
            //继续向下进行最小堆调整
            i = j;
            j = 2*i+1;
        }
    }
    //最小堆排序(降序)
    public static void minHeap_sort(int[] a,int n){
        int temp = 0;
        makeMinHeap(a,n);
        for(int i=n-1;i>0;i--){
            //将根节点(最小节点)与最后一个叶子节点交换,重新进行堆排序
            temp = a[0];
            a[0] = a[i];
            a[i] = temp;
            minHeapFixDown(a,0,i);
        }
    }

//基数排序

    /**
     *
     * @param a 原数组
     * @param temp  临时数组
     * @param n 序列的数字个数
     * @param k 最大的位数2
     * @param r 基数10
     * @param cnt   存储bin[i]的个数
     */
    public static void radix_sort(int[] a,int[] temp,int n,int k,int r,int[] cnt){
        //i:根据位数进行第几轮排序、rtok:根据个位/十位进行排序
        for(int i=0,rtok=1;i<k;i++,rtok = rtok*r){
            //初始化
            for (int j=0;j<r;j++){
                cnt[j] = 0;
            }
            //计算每个箱子的数字个数
            for (int j=0;j<n;j++){
                cnt[(a[j]/rtok%r)]++;
            }
            //cnt[j]的个数修改为前j个箱子一共有几个数字
            for (int j=1;j<n;j++){
                cnt[j] += cnt[j-1];
            }
            //核心过程,按照个位/十位排序
            for (int j=n-1;j>=0;j--){
                //从后往前遍历原数组才能保证数据位于当前桶最后一个即可以确定最终位置
                cnt[(a[j]/rtok)%r]--;
                temp[cnt[(a[j]/rtok)%r]] = a[j];
            }
            for (int j=0;j<n;j++){
                a[j] = temp[j];
            }
        }
    }

 

以上是关于常见排序算法代码总结(Java版)的主要内容,如果未能解决你的问题,请参考以下文章

常见的链表排序(Java版)

常见排序算法总结(java实现)

整理常见排序算法及其时间复杂度总结

经典十大排序算法(含升序降序,基数排序含负数排序)Java版完整代码建议收藏系列

基于比较的七种常见排序算法

基于比较的七种常见排序算法