[算法与数据结构]001_快速排序算法
给自己定了规矩,工作日不看电视,不看电影,只上半个小时社交网,那干嘛呢?只有编程了啊!好久没写排序算法了,写个快排玩玩吧!
快速排序的原理还刻在脑子里,没有忘。大致的排序过程如下所示:
1 4 6 3 1 (1比4小,交换) 2 ↑ ↑ 3 4 1 6 3 4 (交换) 5 ↑ ↑ 6 7 1 6 3 4 (6比4大,交换) 8 ↑ ↑ 9 10 1 4 3 6 (交换) 11 ↑ ↑ 12 13 1 4 3 6 (3比4小,交换) 14 ↑ ↑ 15 16 1 3 4 6 (交换) 17 ↑ ↑ 18 19 1 3 4 6 (i = j,递归对子数列排序,当然这个数组目前已经有序了) 20 ↑
于是俺动手写了个快排,如下所示:
1 #include<iostream> 2 using namespace std; 3 4 void swap(int &a, int &b){ 5 int tem = a; 6 a = b; 7 b = tem; 8 } 9 10 int Partition(int *pData, int low, int high){ 11 int i = low; 12 int j = high; 13 int temp = pData[low]; 14 int tem; 15 while(true){ 16 while(pData[i] < temp && i < high) i++; 17 while(pData[j] > temp && j > low) j--; 18 if(i >= j){ 19 break; 20 } 21 swap(pData[i], pData[j]); 22 } 23 return j; 24 } 25 26 void QuickSort(int *pData, int low, int high){ 27 if(low < high){ 28 int index = Partition(pData, low, high); 29 QuickSort(pData, low, index - 1); 30 QuickSort(pData, index + 1, high); 31 } 32 } 33 34 int main(){ 35 36 int pData[10] = {7,6,8,1,3,9,5,2,4,10}; 37 QuickSort(pData, 0, 9); 38 return 0; 39 }
哈哈,一遍成功!这时候突然想起来以前遇到过的死循环的情况,就是数组中出现两个相同值的情况。数组如下所示:
1 int pData[10] = {7,6,2,1,3,3,5,2,4,10};
果然,换了数组,就排不出大小了,唉,百密一疏啊!不过加个数据相同的处理代码就可以了,在while里面加一句即可,修改后的代码如下:
1 #include<iostream> 2 using namespace std; 3 4 void swap(int &a, int &b){ 5 int tem = a; 6 a = b; 7 b = tem; 8 } 9 10 int Partition(int *pData, int low, int high){ 11 int i = low; 12 int j = high; 13 int temp = pData[low]; 14 int tem; 15 while(true){ 16 if(pData[i] == pData[j]){ 17 j--; 18 } 19 while(pData[i] < temp && i < high) i++; 20 while(pData[j] > temp && j > low) j--; 21 if(i >= j){ 22 break; 23 } 24 swap(pData[i], pData[j]); 25 } 26 return j; 27 } 28 29 void QuickSort(int *pData, int low, int high){ 30 if(low < high){ 31 int index = Partition(pData, low, high); 32 QuickSort(pData, low, index - 1); 33 QuickSort(pData, index + 1, high); 34 } 35 } 36 37 int main(){ 38 39 int pData[10] = {7,6,8,1,3,9,2,2,3,10}; 40 QuickSort(pData, 0, 9); 41 return 0; 42 }
这样,数组有相同数据时,只要有一个作出让步就可以了,好啦!算是复习一下了~