c++练习-快速排序

这个例子将长度为r的数列a从按照从小到大作排列

快速排序的思想简单说来就是

在a中依次先选定一个数key,将这个数依次与a中的其他数做对比,如果比key小则放到key前面,如果比key大就放到key后面。这样对数组a就会分成两个部分。假设位置替换后key最终位置时k。

那么数组的两个部分就分别是 a[0,k-1],a[k+1,r].这时候a[k]已经排好序了

分别对这两个部分进行上面的操作。又会分别分出四个部分。对它们进行同样操作。直到都无法再排序为止跳出循环。

伪代码如下:

void Qsort(array a, int low, int high)

  if low >= high return;

  int first = low;

  int last = high;

  a[first] -> key;

  while(first<last)

    while(first<last && a[last] > key) last--;

    a[first] = a[last];

    while(first<last && a[first] < key) first++;

    a[last] = a[first];

  a[first] = key;

  int k = first;

  Qsort(array a, 0, k-1);

  Qsort(array a, k+1, high);

具体代码如下:

 1 #include <iostream>
 2 #include <stdlib.h>
 3 
 4 using namespace std;
 5 
 6 void Qsort(int a[],int low,int high)
 7 {
 8   if(low>=high) return;
 9   int first=low;
10   int last=high; //这里的high是这个数组的长度
11   int key=a[first]; 
12   while(first<last)
13   {
14     while(first<last&&a[last]>=key) last--; //如果比key大,无需移动,所以last只减少,不赋值
15     a[first]=a[last]; //直到碰到比key小的数,将这个数放到first所在的位置。
16     while(first<last&&a[first]<=key) first++;//如果比key小,无需移动,只要将first增加
17     a[last]=a[first];//直到碰到比key大的数,将这个数放到last的位置。
18   }
19   a[first]=key; //first和last碰头之后,也就是first>=last,说明整个数组遍历了一遍。因此跳出循环,将key值赋予a[first]或者a[last]
20   Qsort(a,low,first-1);//first和last是一样的,选哪个都可以
21   Qsort(a,first+1,high);
22 }
23 int main()
24 {
25   int k = rand() % 10;
26   int i = 0;
27   int a[10];
28   while(i < 10) a[i++] = rand() % 10; //生成大小10的随机数组
29 
30   Qsort(a,0,sizeof(a)/sizeof(a[0])-1);//计算数组大小,注意数组是从0开始计算的,因此会-1。
31 
32   for(int i=0;i<sizeof(a)/sizeof(a[0]);i++)
33   {
34   cout<<a[i]<<" ";
35   }
36   cout << endl;
37   return(0);
38 }

 

posted @ 2015-03-04 16:01  無限大  阅读(221)  评论(0编辑  收藏  举报