时间复杂度为O(N*logN)的常用排序算法总结与Java实现

本文详细介绍了四种时间复杂度为O(N*logN)的排序算法:快速排序、归并排序、堆排序和希尔排序。包括每种算法的基本思想、Java代码实现及性能分析。快速排序平均时间复杂度为O(N*logN),归并排序稳定且额外空间复杂度为O(N),堆排序是原地排序但不稳定,希尔排序在步长>1时不稳定。
摘要由CSDN通过智能技术生成

时间复杂度为O(N*logN)的常用排序算法主要有四个——快速排序、归并排序、堆排序、希尔排序

1.快速排序
·基本思想

    随机的在待排序数组arr中选取一个元素作为标记记为arr[index](有时也直接选择起始位置),然后在arr中从后至前以下标j寻找比arr[index]小的数,然后从前至后以下标i寻找比arr[index]大的数,如果i<j则交换二者的值;重复以上操作,直到i>=j,之后交换arr[index]与arr[j]的值,同时在i>begin中递归排序标记值的左侧数组,在j<end中递归标记值的右侧数组,直到结束,排序完成。

·代码实现

这里只提供一种实现,快速排序有多种实现。

public void quickSort(int[] arr,int begin,int end) {
    int i = begin,j = end;
    //以开始下标的值为标记
    int index = begin;
    while(i<j) {
        //从后到前寻找比标记小的值
        /*
        * 这里需要注意,只能先从后开始找,否则如果先从前找的话,
        * 以后交换arr[j]与arr[index]的值会使比arr[index]大的值在左边
        */
        while (arr[j]>=arr[index]&&i<j) {
            j--;
        }
        //从前到后寻找比标记大的值
        while (arr[i]<=arr[index]&&i<j) {
            i++;
        }
        //如果i<j才交换
        if (i<j) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    //将标记的值与arr[j]交换
    int temp = arr[j];
    arr[j] = arr[index];
    arr[index] = temp;
    //递归标记值的左右数组
    if (i>begin) {
        quickSort(arr,begin,i-1);
    }
    if (j<end) {
        quickSort(arr,i+1, end);
    }
}
·性能分析

    快速排序其实是冒泡排序的一种改进,每次递归,都将整个数组拆分成两部分分别递归,每一次划分过程的时间复杂度为O(N),平均情况

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值