常见的排序算法实现及其复杂度分析(更新中…)
一、交换排序
(一)快速排序
代码实现
int Partition(int* nums,int low,int high){ //划分操作,每次划分将比枢轴元素小的元素放到前面,大的放到后面
int p = nums[low]; //p表示枢轴元素
while(low<high){
while(low<high&&nums[high]>=p) --high;
nums[low] = nums[high]; //将比枢轴元素小的元素移到前面
while(low<high&&nums[low]<=p) ++low;
nums[high] = nums[low]; //将比枢轴元素大的元素移到后面
}
nums[low] = p; //枢轴元素的最终位置
return low; //返回枢轴元素的位置
}
void QuickSort(int* nums,int low,int high){
if(low<high){
int pPos = Partition(nums,low,high); //pPos表示枢轴元素的下标
QuickSort(nums,pPos+1,high); //递归地对枢轴元素左右两个子表进行排序
QuickSort(nums,low,pPos-1);
}
}
稳定性
不稳定,在交换时元素地相对位置会发生变化
复杂度分析
时间效率:最坏为 O ( n 2 ) O(n²) O(n2),平均为 O ( n l o g 2 n ) O(nlog_2n) O(nlog2n)
最坏的情况与划分是否对称有关,原始序列基本有序或者基本无序
空间效率:最坏为 O ( n ) O(n) O(n),平均为 O ( l o g 2 n ) O(log_2n) O(log2n)
容量与递归调用的最大深度一致