Java-时间复杂度为O(nlogn)的排序算法(快速排序, 归并排序, 堆排序, 希尔排序)

/** 包含多种静态排序方法
 * Created by Andre on 2016/6/27.
 */
public class Sorter {
    /**
     * 快速排序
     * 递归形式
     * 第一个记录为枢轴
     * 不稳定
     * @param a 需要排序的数组
     * @param low  数组的起始下标
     * @param high 数组的结束下标
     */
    public static void QuickSort(int a[], int low, int high) {
        if(low >= high) return;

        int pivot = a[low], l = low, h = high;

        for(; l < h; ) {
            for(; l < h && a[h] >= pivot; h--);
            a[l] =  a[h];
            for(; l < h && a[l] <= pivot; l++);
            a[h] = a[l];
        }
        a[l] = pivot;

        QuickSort(a, low, l - 1);
        QuickSort(a, l + 1, high);
    }

    /**
     * 快速排序
     * 递归形式
     * 第一记录为枢轴
     * @param a 需要排序的数组
     */
    public static void QuickSort(int a[]) {
        QuickSort(a, 0, a.length-1);
    }

    /**
     * 二路归并排序
     * 递归
     * 稳定
     * @param a 需要排序的数组
     * @param low 数组的起始下标
     * @param high 数组的结束下标
     */
    public static void MergeSort(int a[], int low, int high) {
        if(low >= high) return;

        int mid = (low + high) / 2;
        MergeSort(a, low, mid);
        MergeSort(a, mid + 1, high);

        int[] b = new int[high - low + 1];
        int i, j, k = 0;
        for(i = low, j = mid + 1; i <= mid && j <= high; ){
            if(a[i] < a[j])
                b[k++] = a[i++];
            else
                b[k++] = a[j++];
        }
        while(i <= mid)
            b[k++] = a[i++];
        while(j <= high)
            b[k++] = a[j++];

        while(low <= high)
            a[high--] = b[--k];
    }

    /**
     * 二路归并排序
     * 递归
     * @param a 需要排序的数组
     */
    public static void MergeSort(int a[]) {
        MergeSort(a, 0, a.length-1);
    }

    /**
     * 堆排序
     * 不稳定
     * @param a 需要排序的数组
     */
    public static void HeapSort(int[] a){
        for(int i = a.length / 2; i > 0 ; i--)
            percDown(a, i, a.length);
        for(int i = a.length-1; i > 0; i--) {
            int tem = a[0];
            a[0] = a[i];
            a[i] = tem;

            percDown(a, 0, i);
        }
    }

    /**
     * 堆的下滤操作
     * @param a 需要排序的数组
     * @param i 下滤的位置
     * @param n 堆的大小
     */
    public static void percDown(int[] a, int i, int n) {
        int tem = a[i];
        for(int child = 2 * i + 1; child < n; i = child, child = 2 * child + 1) {
            if(child != n-1 && a[child] < a[child+1])
                child++;

            if (tem < a[child])
                a[i] = a[child];
            else
                break;
        }
        a[i] = tem;
    }

    /**
     * 希尔排序
     * 增量序列为 a.length / 2, a.length / 4, ... 1
     * 不稳定
     * @param a 需要排序的数组
     */
    public static void ShellSort(int[] a) {
        for(int gap = a.length / 2; gap > 0; gap /= 2) {
            for(int i = gap; i < a.length; i++) {
                int tem = a[i], j;
                for(j = i; j >= gap && tem < a[j - gap]; j -= gap)
                    a[j] = a[j - gap];
                a[j] = tem;
            }
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
时间复杂度为O(nlogn)的排序算法希尔排序堆排序快速排序归并排序。其中归并排序是一种稳定的排序算法,而希尔排序堆排序快速排序是不稳定的排序算法。 <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [python-归并排序算法.docx](https://download.csdn.net/download/qq_43934844/87893705)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [时间复杂度O(nlogn)的排序算法](https://blog.csdn.net/qq_43533956/article/details/123978524)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [时间复杂度为O(nlogn)的排序算法](https://blog.csdn.net/qq_46130027/article/details/129765856)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值