排序-quicksort

快速排序是20世纪十大算法之一。

思路如下:

  1. 先随机选取一个切分元素。
  2. 同时从数组左侧向右(过程a),从右向左依次遍历(过程b)。
  3. 在a中遇到比切分元素大的元素(i),结束a。在b中遇到比切分元素小的元素(j),结束b。然后交换i,j 位置。
  4. 继续执行第二步。直到第三步中的i=j,退出第二步执行。
  5. 交换j和切分元素的位置。
  6. 将数组从j的位置分割为两部分,每一部分再次执行1-5步。

代码如下:

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 void change(int *p,int pos1,int pos2);
 6 void quickSort(int *p,int begin,int end);
 7 void print(int *p,int length);
 8 int partition(int *p,int left,int right);
 9 
10 int main()
11 {
12     int p[] = {2,5,3,11,89,76,24,33,15,15};
13     quickSort(p,0,sizeof(p)/sizeof(int)-1);
14     print(p,sizeof(p)/sizeof(int));
15     cout << "Hello world!" << endl;
16     return 0;
17 }
18 
19 void print(int *p,int length)
20 {
21     for(int i=0;i<length;i++)
22         cout << p[i] << endl;
23 }
24 
25 void quickSort(int *p,int begin,int end)
26 {
27     if(begin >= end)
28         return;
29     int pos = partition(p,begin,end);
30     quickSort(p,begin,pos-1);
31     quickSort(p,pos+1,end);
32 }
33 
34 int partition(int *p,int left,int right)
35 {
36     int i=left,j=right+1;
37     int povit = left;
38     while(true)
39     {
40         while(p[++i]<p[povit])
41         {
42             if(i==right)break;
43         }
44         while(p[--j]>p[povit])
45         {
46             cout << p[j] << endl;
47         }
48         if(i>=j)break;
49         change(p,i,j);
50     }
51     change(p,j,povit);
52     return j;
53 }
54 
55 void change(int *p,int pos1,int pos2)
56 {
57     if(pos1 == pos2)
58     {
59         return;
60     }
61     int temp=p[pos1];
62     p[pos1] = p[pos2];
63     p[pos2] = temp;
64 }

 

posted on 2017-08-18 14:07  ^~~^  阅读(168)  评论(0编辑  收藏  举报

导航