快速排序
1. 基本思想
以将数据分割成两部分为一趟,其中前面的部份都比中间的数据小(升序情况下),后面的数据都比中间的数据大,之后对分割的两部分分别在进行一趟上述的排序,直到整个数据变成有序序列。一般采取递归写法方便实现。
2. 时间复杂度
O(nlogn)
3. 代码实现
void Qsort(int d[], int low, int height)
{
if(low >= height)
return ;
int left = low;
int right = height;
int key = d[left];
while(left < right){
while(left < right && d[right] >= key){
right--;
}
d[left] = d[right];
while(left < right && d[left] <= key){
left++;
}
d[right] = d[left];
}
int mid = left;
d[mid] = key;
Qsort(d, low, mid - 1);
Qsort(d, mid + 1, height);
}
4. 代码注意点
- 此代码选取待排序数据区间的第一个元素用于单趟排序的锚点
int key = d[left];
- 此代码的区间采用的是左闭右闭区间,即待排数据区间为
[left, right]
- 递归返回必须使用
if(low >= height)
,这是由于当low == left || right == height
时会导致low > height