Arrays.sort排序原理

//jdk1.6中Arrays.sort的原理
//jdk1.8中Arrays.sort是由此结论进一步优化得到的。
//算法描述:
//1、设置两个变量i,j,在排序开始的时候,i=0,j=n-1
//2、以数组第一个元素作为flag,flag=a[0]
//3、从j开始向前搜索,j--,找到第一个比flag小的,让a[i]和a[j]交换。
//4、从i开始向后搜索,i++,找到第一个比flag大的,让a[i]和a[j]交换。
//5、重复3~4的过程,直到i和j相遇为止

//6、把分裂开的arr1和arr2都重复上述过程,直到全都只剩下一个元素为止。

var arr = new Aaary(5,6,8,7,2,9,1,3,4);

function (v,start,end){

    if(start>end){

    return ;

}

var n =start;

var m = end;

for(;start!=end;){

    //从后向前找

    for(;end>start;end--){

        if(v[start]>v[end]){

            var temp = v[start]; 

            v[start] = v[end];

            v[end] = temp;

            break;

        }

}

//从前往后找

for(;start<end;start++){

    if(v[start]>v[end]){

            var temp = v[start]; 

            v[start] = v[end];

            v[end] = temp;

            break;

        }

}

    //start==end;数组被分解为两个数组

    if(n<start-1){

           mysort(v,n,start-1);

    }

    if(m<start+1){

        mysort(v,start+1,m);

        }

    mysort(arr,0,arr.length-1);
    document.write(arr);

}

//性能对比:
//两个for,如果前后分别执行 和 嵌套执行
//分别是m+n次,和  m*n次
//概念:时间复杂度O(M+N)  O(M*N)
//冒泡排序比较了多少次?n+n-1+n-2……+1
//O((N+1)N/2)
//只保留最高次幂
//O((1/2)*N^2+(1/2)*N)
//系数去掉
//O((1/2)*N^2)
//O(N^2)


//快速排序的情况,;假定T(n)为长度为n的数组的比较次数
//T(n)=2T(n/2)+n次比较    ------1
//T(n/2)=2T(n/4)+n/2次比较。-------2
//----2*2得到-----3
//2T(n/2)=4T(n/4)+n次比较。--------3
//联立上面两个式子-----1和-----3
//T(n)=4T(n/4)+2n次比较。
//T(n)=128T(n/128)+log(128)n次比较




//T(n)=nT(1)+log(n)n次比较


//O(nlog(n)) *****
//O(nlgn)


//运气很差的情况
//  n/2     1  n-1
//n次比较1  n-1
//n-1次比较1,1,n-2
//……
//1次比较1,1,1,1,1,1,1,1,1,1……
//当运气最差的时候,快速排序的时间复杂度=冒泡排序的时间复杂度。

### 回答1: Java中的Arrays.sort()方法使用的是快速排序算法,它是一种基于比较的排序算法。快速排序的基本思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,然后再分别对这两部分记录继续进行排序,以达到整个序列有序的目的。在实现过程中,快速排序采用了分治的思想,将待排序的序列分成若干个子序列,对每个子序列进行排序,最终合并成一个有序的序列。快速排序的时间复杂度为O(nlogn),是一种高效的排序算法。 ### 回答2: Java中的Arrays类提供了一个sort方法,该方法可以对数组进行排序排序算法使用的是快速排序算法。 快速排序算法是一种分治算法,其思想是将数组划分为较小和较大的两个子数组,然后递归地排序两个子数组。基本步骤如下: 1.选定数组中的一个元素作为枢轴(pivot),通常选择第一个或最后一个元素。 2.将数组分成两个子数组:小于枢轴的元素和大于枢轴的元素。 3.递归地对小数组和大数组进行排序。 4.将小数组、枢轴和大数组合并起来形成有序数组。 在实现Arrays.sort方法时,Java使用了优化快速排序算法。在排序过程中,Java将小数组使用插入排序算法进行排序,提高了性能。此外,Java还使用了“三点检查”策略来选择中间元素,以防止快速排序算法恶化为O(n^2)的运行时间。 总之,Java的Arrays.sort方法使用的是优化的快速排序算法,该算法通过递归地将数组划分为两个子数组来排序。在排序过程中,小数组使用插入排序算法进行排序。此外,Java还使用“三点检查”策略来选择中间元素以防止算法的恶化。 ### 回答3: Java中的Arrays类为我们提供了一种快速对数组进行排序的方法,即Arrays.sort()方法。Arrays.sort()方法的排序原理是使用了快速排序(QuickSort)算法,这是一种常见且高效的排序算法。 快速排序算法的基本思想是选择一个基准数(pivot),将数组中小于基准数的元素放在基准数左侧,大于基准数的元素放在基准数右侧,然后对左右两侧的子数组递归进行同样的操作。当子数组中只有一个元素或者为空时,排序完成。 快速排序算法的优点是运行时间较短,通常比其他O(n log n)算法快得多。而Arrays.sort()方法又通过使用基本类型的快速排序算法、合并排序算法和插入排序算法三种排序算法的结合,提高了排序效率。具体地说,Arrays.sort()方法根据被排序的数组的大小和元素的数据类型来在三种算法之间做出选择,并且为了提高排序效率,对基本类型采用了双轴快速排序;对于对象数组,Arrays.sort()方法采用了归并排序和插入排序。 双轴快速排序是一个改进版的快速排序,它使用两个pivot来分割数组,从而更加快速和稳定。因为快速排序算法在处理大集合时可能会发生很多的交换操作,但这些交换操作会比较费时,在数组非常大时,复杂度会达到O(n^2)。而双轴快速排序避免了这种情况,使得排序效率得到了很好的提升。 综上所述,Arrays.sort()方法通过使用不同的排序算法,根据数据类型和数组大小的不同进行判断,选择最适合的排序算法,提高排序效率,以达到对数组排序的目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值