用C++ 實現快速排序

之前經常“手撕”快速排序的代碼毫無感覺,因爲用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;
}

這些基礎千萬不要小瞧啊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章