Quicksort

快速排序

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

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

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

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 100000

 3 

 4 void quick_sort(int s[], int l, int r)  

 5 {      

 6     int temp;

 7     if (l < r)  

 8     {   

 9         temp=s[l];

10         s[l]=s[(l+r)/2];

11         s[(l+r)/2]=temp;     

12         int i = l, j = r, x = s[l];  

13           while (i < j)  

14           {  

15             while(i < j && s[j] >= x) // 从右向左找第一个小于x的数  

16                   j--;    

17              if(i < j)   

18                  s[i++] = s[j];  

19                   

20                while(i < j && s[i] < x) // 从左向右找第一个大于等于x的数  

21                 i++;    

22             if(i < j)   

23                 s[j--] = s[i];  

24           }  

25            

26            s[i] = x;  

27         quick_sort(s, l, i - 1); // 递归调用   

28         quick_sort(s, i + 1, r);  

29      }  

30 }      

31 int main()

32 {

33     int i,a[N],n;

34     scanf("%d",&n);

35     

36     for(i=0;i<n;i++)

37         scanf("%d",&a[i]);

38     quick_sort(a,0,n-1);

39     printf("%d",a[0]);

40     for(i=1;i<n;i++)

41         printf(" %d",a[i]);

42 }

 

你可能感兴趣的:(Quicksort)