快速排序

   截止到这篇博客,已经将常见的排序算法都进行了实现, 下图是不同排序算法的效率分析。可以看到对于10以内的排序,采用插入排序最快,对于1000以内采用希尔排序更加合理,当然要合理选取增量。对于1000个数据量以上采用快排,效率最高。堆排序虽然时间复杂度也是O(NlogN),但是实际中堆排序比希尔排序要慢。关于归并排序,因为归并的过程比较麻烦,对于小数据的排序不常用,但是对于外部排序则采用的是归并思想。

 

  1 /************************************************************************/
  2 /* 快排
  3 /* 时间复杂度O(NlogN)
  4 /************************************************************************/
  5 #include <stdio.h>
  6 #include <cstdlib>
  7 
  8 #define swap(a, b) {(a) = (a) ^ (b); (b) = (a)^ (b); (a) = (a) ^ (b);}
  9 
 10 //插入排序
 11 void InsertionSort(int* array, int size)
 12 {
 13     int i, j;
 14     int tmp;
 15     for (i = 1; i < size; ++i)
 16     {
 17         tmp = array[i];
 18         for (j = i; array[j - 1] > tmp &&  j > 0; --j)
 19         {
 20             array[ j ] = array[j - 1];
 21         }
 22         array[ j ] = tmp;
 23     }
 24 }
 25 
 26 //选取枢纽元,将最左、最右和中间三个中最小的那个作为枢纽元
 27 int MinThree(int array[], int left, int right)
 28 {
 29     int center = (left + right) / 2;
 30 
 31     //将三个数交换位置,使得array[left]<array[center]<array[right]
 32     if (array[left] > array[center])
 33     {
 34         swap(array[left], array[right]);
 35     }
 36     if (array[left] > array[right])
 37     {
 38         swap(array[left], array[right]);
 39     }
 40     if (array[center] > array[right])
 41     {
 42         swap(array[center], array[right]);
 43     }
 44     
 45     //将中间的枢纽元与right - 1上的元素交换,避免枢纽元参与排序过程
 46     swap(array[center], array[right - 1]);
 47 
 48     return array[right - 1];
 49 }
 50 
 51 //快速排序核心程序
 52 void QuickSort(int array[], int left, int right)
 53 {
 54     int pivot = MinThree(array, left, right);
 55 
 56     //递归终止的条件,元素个数为10时进行截断
 57     if (left - right > 10)
 58     {
 59         int i = left;
 60         int j = right - 1;
 61         while (true)
 62         {
 63             //快排核心思想,交换元素,从左和右分别寻找比枢纽元大的和比枢纽元小的元素
 64             while (array[++i] > pivot){}
 65             while (array[--j] < pivot){}
 66 
 67             //交换这两个元素的位置
 68             if (i < j)
 69             {
 70                 swap(array[i], array[j]);
 71             }
 72             else
 73             {
 74                 break;
 75             }
 76         }
 77 
 78         //将枢纽元与i位置元素交换回来
 79         swap(array[right - 1], array[i]);
 80 
 81         //枢纽元就将数组分成了两部分,一部分比枢纽元大的元素,一部分是比枢纽元小的元素,分别进行快排
 82         QuickSort(array, left, i - 1);
 83         QuickSort(array, i + 1, right);
 84     }
 85     else
 86     {
 87         //元素个数较少时,采用插入排序更快
 88         InsertionSort(array + left, right - left + 1);
 89     }
 90 }
 91 
 92 int main()
 93 {
 94     int array[] = {10,  78, 89,  105, 953, 243, 19, 45, 86, 84, 853, 542, 11, 546, 365, 745, 185, 45, 341, 425, 854, 62, 42, 98, 742,
 95     102, 666, 441, 743, 548, 220, 12, 60, 1, 562, 888, 1025, 5423, 14, 448, 458, 635, 45, 8, 753, 91, 754, 685, 444, 85, 364, 542, 
 96     54, 983};
 97 
 98     int size = sizeof(array) / sizeof(int);
 99 
100     QuickSort(array, 0, size - 1);
101     int i = 0;
102     while (i < size)
103     {
104         if(i  % 8 == 0)
105             printf("\r\n");
106         printf("%5d     ", array[i++]);
107     }
108     system("pause");
109     return 0;
110 }

 

posted @ 2017-02-26 15:37  oscarwin  阅读(224)  评论(0编辑  收藏  举报