首页 > 编程知识 正文

快速排序是怎么排序的,算法分析与设计快速排序

时间:2023-05-05 02:55:27 阅读:22749 作者:2049

根据快速排序算法的原理,要排序的数组为A[0]……A[N-1],首先选择任意数据(通常选择数组的第一个数)作为关键数据,然后向左移动所有小于该数据的数这个过程称为快速排序。 值得注意的是,快速排序不是稳定的排序算法。 这意味着多个相同值的相对位置在算法结束时可能会发生变动。

算法彩排假设第一个序列{xi}是5、3、7、6、4、1、0、2、9、10和8。

此时,ref=5、i=1、j=11,从后面查找,小于前5的数为x8=2,因此数组为2、3、7、6、4、1、0、5、9、10、8。

此时,i=1,j=8,如果去了再找,大于前五的数是x3=7,所以序列为2、3、5、6、4、1、0、7、9、10、8。

此时,如果i=3,j=8,从第8个开始查找,则小于前5的数为x7=0,因此为2、3、0、6、4、1、5、7、9、10、8。

此时,如果从i=3、j=7、3位开始向后查找,则比前5大的数为x4=6,因此为2、3、0、5、4、1、6、7、9、10、8。

此时,如果从第i=4、j=7、7开始查找,则小于前5的数为x6=1,因此为2、3、0、1、4、5、6、7、9、10、8。

此时,i=4,j=6从第4位开始向后寻找,到第6位为止是大于5的数。 此时,i=j=6,ref成为边界线,以前的数比其小,以后的数比其大。 前后两个部分的数量也可以用同样的方法进行排序。

代码块公共静态int [ ] qsort [ ],int start,intend]{intpivot=arr[start]; int i=start; int j=end; while(ij ) ) while ) (ij ) ) arr[j]pivot ) ) j----; }while((ij ) ) arr[i]pivot ) ) I; (if ) (arr[I]==arr[j] ) (ij ) ) I; } else { int temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; } if (I-1开始) arr=qsort ) arr,start,I-1 ); if(j 1end ) arr=qsort ) arr,j1,end; 返回(arr ); } publicstaticvoidmain (string [ ] args (intarr )=newint ) ) 3、3、7、9、122344、4656、34、4656、5 int len=arren ARR=qsort(ARR,0,len ); for(intI:ARR ) system.out.print ) I't '; }//方式2//更高效的代码: (TextendsComparable和SortUtil是自己封装的类,重写并实现了compareTo和swap方法(公共TextendsComparable supertt [ ] quick sort (t [ ] targetarr,int start,int end ) {inti=start 1,j=end; T key=targetArr[start]; SortUtilT sUtil=new SortUtilT (; if (开始==结束)返回) targetarr; /*I和j--从两个方向搜索和交换不符合条件的值**条件是I方向小于key,j--方向小于key */while (真) while (真) targetarr ).compareto ) key if(I=j ) break; sutil.swap(targetarr,I,j ); if(targetarr(I )==key ) ) j----; (else ) I; }/*重要数据包括:“中间”*/sutil.swap(targetarr、start、j ); if(starti-1 ) this.quicksort ) targetarr,start,i-1 ); (if ) j 1end ) this.quicksort ) targetarr,j1,end ); } returntargetArr; (//方式3 )减少更换次数,提高效率/*/privateTextendsComparable? supertvoidquicksort (t [ ] targetarr,intstart,intend ) {inti=start,j=end; Tkey=targetArr[start]; while(ij ) (/*沿j--方向遍历目标数组至小于key的值()/while ) jitargetarr (.com Pareto ) (key )=0) ) j--; (if ) ij ) ) {/*targetArr[i]已存储在密钥中,) */targetArr[i]=targetArr[j]; I; ((/)沿I方向遍历目标数组,直到值大于key ((/while ) Ijtargetarr[I].compareto ) key (=0) ) ) )此处必须设置为零或更小,并且在数组中}if(ij ) {/*targetArr[j]已存储在targetArr[i]中,(*/targetArr[j]=targetArr[i]; j----; }/*此时i==j*/targetArr[i]=key; //应该做出判断//*在递归调用中,将key的上一个完成(*.this.quicksort(targetarr,start,i-1 ) ) ) ) ) ) )//两个递归应该加以判断}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。