码迷,mamicode.com
首页 > 其他好文 > 详细

Quicksort

时间:2015-05-12 22:21:52      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:

快速排序

传说中实际工作中应用最多的排序方法

但是实际工作大多都是直接用库实现 不必自己造轮子

但还是要了解其原理  方便应用

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 }

 

Quicksort

标签:

原文地址:http://www.cnblogs.com/threezj/p/4498594.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!