之前經常“手撕”快速排序的代碼毫無感覺,因爲用C語言寫的還不錯,就沒有試過其他的方法,後來很久沒寫,,終於又有一天“ 同學,寫一個快排的代碼吧 ”,,我竟然栽在快排上了!!
經過此次痛苦的教訓,我再次用C++寫一遍
#include <iostream>
#include <vector>
using namespace std;
//int PartSort(vector<int> &v,int left,int right)
//{
// int key = left; //以左邊的第一個數爲基值
// while (left<right)
// {
// while (left<right&&v[right] >= v[key]) //先從右向左找
// right--;
// while (left<right&&v[left] <= v[key]) //再從左向右找
// left++;
// swap(v[left], v[right]); //找到以後交換兩個值
// }
// swap(v[left], v[key]); //將基值放在中間
// return left; //返回下一個基值
//}
//void QuickSort(vector<int>& v,int left,int right) //左右指針法
//{
// if (left>right)
// return ;
// int i = PartSort(v, left, right); //找到基值
// QuickSort(v, left, i-1); //對左半部分遞歸排序
// QuickSort(v, i+1, right); //對右半部分遞歸排序
//}
void quickSort(vector<int> &num, int l, int r) //挖坑法
{
if (l >= r) //先檢查左右條件
return;
int i = l, j = r, x = num[l];
while (i < j) {
while (i < j && num[j] >= x)//從右向左找到第一個小於x的
j--;
if (i < j)
num[i++] = num[j];//填坑之後i++
while (i < j && num[i] <= x)//從左向右找第一個大於x的數
i++;
if (i < j)
num[j--] = num[i];
}
num[i] = x; //把最開始取出來的x放到i處
quickSort(num, l, i - 1);//以i爲中間值,分左右兩部分遞歸調用
quickSort(num, i + 1, r);
}
int main()
{
vector<int> v = {1,3,6,4,5,8,2};
quickSort(v,0,v.size()-1);
for (auto &e : v)
cout <<e<< " ";
system("pause");
return 0;
}
這些基礎千萬不要小瞧啊。