标签:
快速排序
传说中实际工作中应用最多的排序方法
但是实际工作大多都是直接用库实现 不必自己造轮子
但还是要了解其原理 方便应用
quicksort 采用分治和递归的方法
分治的思修就是 先选定一个主元(pivot) 把比主元小的数放左边 比它大的数放右边
本文中直接用第一个元素作为主元 这种方不是很好 实际还有很多主元采用方法
从数组的尾巴开始和主元比较 若比主元大则不动 进行right--的操作 也就是比较下一个元素
一旦碰到比主元小的 则a[left]=a[right] 也就是放到左边去 这是右边right这个位置的元素虽然没变 但实际已经没用了 因为已经放到了左边
所以这时要从左边开始寻找来填补右边a[right]的空缺 从left+1开始和pivot比较
若比pivot小则不动 left++ 比较下一个
反之 则 a[right]=a[left] 这时右边填补了空缺 但是左边left的位置成了新的空缺
再循环上面的操作
递归很简单
分治完以后 分别递归主元左边的数 和右边的数即可
下面是代码
1 #include "stdio.h" 2 #define N 10 //元素数量 3 int div(int a[],int left,int right) 4 { 5 int base; 6 base=a[left]; 7 while(left<right) 8 { 9 while(left<right && a[right]>base) 10 right--; 11 a[left]=a[right]; 12 while(left<right && a[left]<base) 13 left++; 14 a[right]=a[left]; 15 } 16 a[left]=base; 17 return left; 18 } 19 void quicksort(int a[],int left,int right) 20 { 21 int i; 22 23 if(left>right) 24 return; 25 i=div(a,left,right); 26 quicksort(a,left,i-1); 27 quicksort(a,i+1,right); 28 } 29 int main() 30 { 31 int i,a[N]; 32 for(i=0;i<N;i++) 33 scanf("%d",&a[i]); 34 quicksort(a,0,N-1); 35 36 for(i=0;i<N;i++) 37 printf("%d ",a[i]); 38 }
标签:
原文地址:http://www.cnblogs.com/threezj/p/4498594.html