1 排序思想:
通过一趟排序,将待排序记录分成两个部分,其中一部分的关键字都比另一部分的关键字小。再分别对这两部分进行排序,直到整个序列有序。
以整型数组为例,一趟快速排序的方法:
待排序序列为R[low...high],取一个基准,一般为R[low]
设i=low,j=high-1
①从j向前搜索,直到j<=i或者R[j]< R[low],将R[j]与R[i]交换
②从i向后搜索,直到j<=i或者R[i]> R[low],将R[i]与R[j]交换
重复①、②步,直到j<=i,这样完成一趟排序,i就是最终基准所放置的位置
2 算法实现:
// 对num[]的[low,high)段执行快速排序 void quick_sort(int num[],int low,int high){ if(low<high){ int pivotloc=partion(num,low,high); quick_sort(num,low,pivotloc); quick_sort(num,pivotloc+1,high); } } // 对num[]的[low,high)段,按照num[low]分割成两部分 // 并返回最终num[low]所放置位置 int partion(int num[],int low,int high){ int i=low,j=high-1; int key=num[low]; while(i<j){ while(i<j&&key<=num[j]) j--; SWAP(num[i],num[j]); while(i<j&&key>=num[i]) i++; SWAP(num[i],num[j]); } return i; } // 交换 #define SWAP(x,y) {int t; t = x; x = y; y = t;}
3 性能分析:
3.1 空间复杂度:在理想状态下是O(logn),最坏情况下是O(n)
3.2 时间复杂度:
最好情况:一趟排序需要对记录进行比较约n次,则总的时间复杂度要看执行划分的次数。理想情况下,每次划分都将序列分成两个等长的部分,则时间复杂度是O(nlogn)。最坏情况下,每次划分都只将序列分成一部分,时间复杂度是O(n^2)。
平均时间复杂度是O(nlogn)
当序列已经是正序,快速排序退化为冒泡排序。
3.3 稳定性:不稳定
时间: 2024-12-25 18:41:48