快速排序-V1
一、代码实现
1.大致思路
假如有一个数,这个数组自然有序
假如有2个数,我们选第一个数为标准,比它小的数排它前面,比它大排后面,那么这两个数将有序。
假如有3个数,我们选第一个数为标准,比它小的数排它前面,比它大排后面。
假如有4个数,我们选第一个数为标准,比它小的数排它前面,比它大排后面。
。。。
假如有n个数,我们选第一个数为标准,比它小的数排它前面,比它大排后面。
可以发现,从n到1,可以看作一个递归的过程,把排在前面的数和排在后面的数分别看作新的数组进行排列
2.代码
我们直接上代码:
int partition(int*a,int start_index,int end_index){
// 选择第一个元素作为pivot
int pivot = a[start_index];
// 左右两个索引
int left = start_index;
int right = end_index;
while (left<right){
// 右指针先移动
while (left<right){
if(a[right]<pivot) {
a[left] = a[right];
break;
}
else
right--;
}
while (left<right){
if(a[left]>pivot){
a[right] = a[left];
break;
}
else
left++;
}
}
a[left] = pivot;
return left;
}
void QuickSort_v1(int *a,int start_index,int end_index){
if(start_index>end_index)
return;
int pivot_index = partition(a,start_index,end_index);
QuickSort_v1(a,start_index,pivot_index-1);
QuickSort_v1(a,pivot_index+1,end_index);
}
3.代码讲解
当主函数调用QiuckSort函数,函数将选定一个pivot作为标准对数组排列,并得到pivot最后的索引。
再对索引左右分别进行QuickSrt。
递归停止条件即为左右索引相等,即数组只有一个元素自然有序。
二、复杂度
空间复杂度:O(log_2N)
时间复杂度:O(Nlog_2N)
- 空间复杂度:由于递归调用会消耗栈资源,对于一个有n个元素的数组,最坏情况需要递归调用log_2N次。
- 时间复杂度:每次递归调用都会循环N、N/2、N/4、、、1,则总共O(Nlog_2N)