[算法与数据结构]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 }

这样,数组有相同数据时,只要有一个作出让步就可以了,好啦!算是复习一下了~

 

 

posted @ 2012-10-09 22:30  邵贤军  阅读(387)  评论(1编辑  收藏  举报