快速排序的思想:
选择一个基准元素,比基准元素小的放基准元素的前面,比基准元素大的放基准元素的后面,这种动作叫分区,每次分区都把一个数列分成了两部分,每次分区都使得一个数字有序,然后将基准元素前面部分和后面部分继续分区,一直分区直到分区的区间中只有一个元素的时候,一个元素的序列肯定是有序的嘛,所以最后一个升序的序列就完成啦
但是关于基准元素的选择有两种
1.第一种是每次都选序列的子序列的第一个元素(有缺陷)
2.第二种是每次都选择子序列中的第x个元素,x随机
普通快速排序
代码如下:
#include<bits/stdc++.h> using namespace std; #define n 5 int a[n]; void swap_t(int a[],int i,int j) { int t=a[i]; a[i]=a[j]; a[j]=t; } int par(int a[],int p,int q) { int i=p;//p是轴 int x=a[p];//基准元素 for(int j=p+1;j<=q;j++) { if(a[j]<=x)//升序 { i++; swap_t(a,i,j); } } swap_t(a,p,i); return i;//轴位置 } void QuickSort(int a[],int p,int q) { if(p<q)//序列中元素个数大于1 { int r=par(a,p,q); QuickSort(a,p,r-1); QuickSort(a,r+1,q); } } int main() { int i; for(i=0;i<n;i++) { scanf("%d",&a[i]); } QuickSort(a,0,n-1); for(i=0;i<n;i++) { printf("%d\n",a[i]); } return 0; }