扫码关注公众号

排序算法之快速排序
03-24
467观看
01

有一个公司有若干员工,要求设计一个签到系统来记录员工的签到顺序,并能够在nlogn的时间复杂度内利用尽可能少的辅助空间将签到的员工按照员工i

思路:在所有算法中只有堆排序和归并排序能够达到时间复杂度的要求,而堆排序对空间的要求又要优于归并排序,所以最后采用了堆排序来实现。/*构建员工模型*/classStaff{intid;//员工idStaff(intid){this.id=id;}publicvoidsetId(intid){this.id=id;}publicintgetId(){returnthis.id;}}publicclassStaffSort{privateStaff[]log;//记录员工序号序列privateinttotalStaff;//员工总人数privateintcurrentStaff;//此时员工人数publicStaffSort(inttotalStaff){//TODOAuto-generatedconstructorstubthis.totalStaff=totalStaff;currentStaff=0;log=newStaff[totalStaff];}/**@authorSam*@paramid*@returnisSuccess*Described员工签到*/publicbooleancheck(intid){StaffnewStaff=newStaff(id);log[currentStaff]=newStaff;trickleUp(currentStaff++);returntrue;}/**@authorSam*@paramindex*@returnisSuccess*Described向上调整堆模型,使各点的值不大于其双亲结点的值*/publicvoidtrickleUp(intindex){intparent=(index-1)/2;Staffbottom=log[index];while(index>0&&log[parent].getId()<bottom.getId()){log[index]=log[parent];index=parent;parent=(parent-1)/2;}log[index]=bottom;}/**@authorSam*@param*@returnroot*Described获取并删除堆顶*/publicStaffremove(){Staffroot=log[0];log[0]=log[--currentStaff];trickleDown(0);returnroot;}/**@authorSam*@paramindex*@return*Described向下调整堆结构,是堆顶元素不小于孩子结点的值*/publicvoidtrickleDown(intindex){intlargeChild;Stafftop=log[index];while(index<currentStaff/2){intleftChild=2*index+1;intrightChild=leftChild+1;if(rightChild<currentStaff&&log[leftChild].getId()<log[rightChild].getId()){largeChild=rightChild;}else{largeChild=leftChild;}if(top.getId()>=log[largeChild].getId()){break;}log[index]=log[largeChild];index=largeChild;}log[index]=top;}/**@authorSam*@paramargs*@return*Described打印排序后的结果*/publicstaticvoidmain(String[]args){int[]staffs=newint[]{1,3,5,2,12,10,15};StaffSortss=newStaffSort(50);for(inti=0;i<staffs.length;i++){ss.check(staffs[i]);}while(ss.currentStaff!=0){System.out.print(ss.remove().getId()+"");}}}

来自:排序算法-高级排序(快排、堆排等)
02

string = "192.0.0.1?!289.0.0.1!0.0.0.0!192.163.10.28?192.0.0.1"
要求:

importres="192.0.0.1?!289.0.0.1!0.0.0.0!192.163.10.20?192.0.0.1"ips=re.split(r"\?!|!|\?",s)deflastOne(i):returni.split('.')[-1]ips.sort(key=lastOne)print(ips)

来自:排序算法-高级排序(快排、堆排等)
03

快速排序的基本思想是什么?

该思想可以概括为:挖坑填数+分治法。1、从要排序的数据中取一个数为“基准数”。2、通过一趟排序将要排序的数据分割成独立的两部分,其中左边的数据都比“基准数”小,右边的数据都比“基准数”大。3、然后再按步骤2对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

来自:排序算法-高级排序(快排、堆排等)
04

快速排序的代码实现。

/***快速排序:Java**@authorskywang*@date2014/03/11*/publicclassQuickSort{/**快速排序**参数说明:*a--待排序的数组*l--数组的左边界(例如,从起始位置开始排序,则l=0)*r--数组的右边界(例如,排序截至到数组末尾,则r=a.length-1)*/publicstaticvoidquickSort(int[]a,intl,intr){if(l<r){inti,j,x;i=l;j=r;x=a[i];while(i<j){while(i<j&&a[j]>x)j--;//从右向左找第一个小于x的数if(i<j)a[i++]=a[j];while(i<j&&a[i]<x)i++;//从左向右找第一个大于x的数if(i<j)a[j--]=a[i];}a[i]=x;quickSort(a,l,i-1);/*递归调用*/quickSort(a,i+1,r);/*递归调用*/}}publicstaticvoidmain(String[]args){inti;inta[]={30,40,60,10,20,50};System.out.printf("beforesort:");for(i=0;i<a.length;i++)System.out.printf("%d",a[i]);System.out.printf("\n");quickSort(a,0,a.length-1);System.out.printf("aftersort:");for(i=0;i<a.length;i++)System.out.printf("%d",a[i]);System.out.printf("\n");}}

来自:排序算法-高级排序(快排、堆排等)
课程
专栏
算法-排序算法-高级排序(快排、堆排等)
3专栏
1课程
4 试题