快速排序C++实现
快速排序实现代码
#include<bits/stdc++.h>
using namespace std;
int Partition(vector<int>& v, int low, int high) {
//设置左指针low指向顺序表表头,右指针high指向表尾,相向移动,左指针找到小于枢轴的值与右指针交换,右指针反之
int pivot = v[low];
//用顺序子表的第一个元素作为枢轴
//初始时,第一个元素已被存入变量pivot,在右指针向左找到小于枢轴的值直接赋值给左指针指向的元素即可实现交换,此时右指针指向的元素可以视为空,左指针移动找到大于枢轴的值,赋值给右指针指向的空间
//左右指针交替交换,总有一个空位(枢轴让出的空位)
//最后交换的是左指针low指向的元素,low所指向即为枢轴的最后位置
while(low < high) {
while(low < high && v[high] >= pivot) --high;//向左寻找
v[low] = v[high];
while(low < high && v[low] <= pivot) ++low;//向右寻找
v[high] = v[low];
}
v[low] = pivot;//是枢轴落在最终位置
return low;
//划分算法,左右指针共同扫描整个链表一次,时间复杂度O(n)
}
void QuickSort(vector<int>& v, int low, int high) {
//递归直到每一个部分都被划分完成,完成排序
//算法时间复杂度O(logn)
if(low < high) {
int pivotpos = Partition(v, low, high);
QuickSort(v, low, pivotpos - 1);//左半部分划分
QuickSort(v, pivotpos + 1, high);//右半部分划分
}
}
int main(int argc, char const *argv[])
{
vector<int> v;
int t;
while(scanf("%d", &t) && t != 0){
v.push_back(t);
}
QuickSort(v,0, v.size() - 1);
for(int i = 0; i < v.size(); i++)
printf("%d ", v[i]);
return 0;
}
算法思路
快速排序属于交换排序的一种,基于分治法,在表中取一个元素枢轴(这里取第一个),将表中小于枢轴的元素移动到枢轴右边,大于枢轴的元素移到左边,这样进行一次划分后枢轴就落到它排序后应该存放的最终位置,在分别递归地划分左边的部分和右边的部分,直到每个划分部分的长度为1,这样就完成了快速排序。一般情况下时间复杂度为O(nlogn)。
测试
以0为输入结束标志
鸣谢
本算法借鉴王道考研数据结构快速排序的伪代码