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 }