Chinaunix首页 | 论坛 | 博客
  • 博客访问: 141114
  • 博文数量: 56
  • 博客积分: 245
  • 博客等级: 二等列兵
  • 技术积分: 520
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-08 14:43
个人简介

慢慢来

文章分类

全部博文(56)

文章存档

2017年(5)

2016年(2)

2015年(6)

2014年(28)

2013年(5)

2012年(10)

我的朋友

分类: C/C++

2014-08-14 11:19:56

**转载请注明**

快速排序,又一个divide-and-conquer的实例。
虽然最坏情况是O(n^2),但是平均期望效率是O(nlgn),所以在应用中还是比较广泛的。



原理:

1. 在原数组里取一个点(假如是末尾的),小于它的往前‘放’;大于的往后排;排完了把它放中间。
2. 然后把大小两子数组再排序。
    * ‘放’:每次标杆 j 向后移,遇到小于标杆的就跟 i+1 交换,交换时 i 也往后移。


点击(此处)折叠或打开

  1. #include <iostream>

  2. using namespace std;

  3. void Switch ( int*, int, int );
  4. void Print_array ( int*, int, int );

  5. void Quick_sort ( int*, int, int );
  6. int Partition ( int*, int, int ); // Find the final pivot position

  7. int main(){
  8.     int array[] = { 2,8,7,1,3,5,6,4 };
  9.     Quick_sort(array, 0, sizeof(array)/sizeof(int)-1);

  10.     Print_array(array, 0, sizeof(array)/sizeof(int)-1);
  11.     return 0;
  12. }

  13. void Quick_sort ( int* array, int start, int end){
  14.     if ( start < end ){
  15.         int p = Partition(array, start, end);
  16.         Quick_sort ( array, start, p-1 );
  17.         Quick_sort ( array, p+1, end );
  18.     }
  19. }

  20. int Partition ( int* array, int start, int end ){
  21.     int i = start-1;
  22.     for( int j = start; j <= end-1; j++ ){
  23.         if ( array[j] < array[end] ){
  24.             i++;
  25.             Switch(array, i, j);
  26.         }
  27.     }
  28.     i++;
  29.     Switch(array, i, end);
  30.     return i;
  31. }

  32. void Switch ( int* array, int index1, int index2 ){
  33.     int mid = array[index1];
  34.     array[index1] = array[index2];
  35.     array[index2] = mid;
  36. }

  37. void Print_array ( int* array, int start, int end ){
  38.     while( start <= end ){
  39.         cout << array[start] << endl;
  40.         start++;
  41.     }
  42. }

运行结果:


空间复杂度: 
    O(1)

时间复杂度:
    O(n^2)


阅读(529) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~