算法之美——排序算法总结

原文:http://blog.csdn.net/sangni007/article/details/7995644

各种排序算法的简单比较

算法之美——排序算法总结_第1张图片

1.稳定性比较

插入排序、冒泡排序、二叉树排序、二路归并排序及其他线形排序是稳定的

选择排序(从代码看,有位置置换)、希尔排序、快速排序、堆排序是不稳定的

2.时间复杂性比较

插入排序、冒泡排序、选择排序的时间复杂性为O(n2)

其它非线形排序的时间复杂性为O(nlog2n)

线形排序的时间复杂性为O(n);

3.辅助空间的比较

线形排序、二路归并排序的辅助空间为O(n),其它排序的辅助空间为O(1);

4.其它比较

插入、冒泡排序的速度较慢,但参加排序的序列局部或整体有序时,这种排序能达到较快的速度。

反而在这种情况下,快速排序反而慢了。

当n较小时,对稳定性不作要求时宜用选择排序,对稳定性有要求时宜用插入或冒泡排序。

若待排序的记录的关键字在一个明显有限范围内时,且空间允许是用桶排序。

当n较大时,关键字元素比较随机,对稳定性没要求宜用快速排序。

当n较大时,关键字元素可能出现本身是有序的,对稳定性有要求时,空间允许的情况下。

宜用归并排序。

当n较大时,关键字元素可能出现本身是有序的,对稳定性没有要求时宜用堆排序。

*************************************************************************************

重温经典排序思想--常用排序全解  
/* 
============================================================================= 
相关知识介绍(所有定义只为帮助读者理解相关概念,并非严格定义): 
1、稳定排序和非稳定排序 
简单地说就是所有相等的数经过某种排序方法后,仍能保持它们在排序之前的相对次序,我们就 
说这种排序方法是稳定的。反之,就是非稳定的。 
比如:一组数排序前是a1,a2,a3,a4,a5,其中a2=a4,经过某种排序后为a1,a2,a4,a3,a5, 
则我们说这种排序是稳定的,因为a2排序前在a4的前面,排序后它还是在a4的前面。假如变成a1,a4, 
a2,a3,a5就不是稳定的了。

2、内排序和外排序

在排序过程中,所有需要排序的数都在内存,并在内存中调整它们的存储顺序,称为内排序; 
在排序过程中,只有部分数被调入内存,并借助内存调整数在外存中的存放顺序排序方法称为外排序。

3、算法的时间复杂度和空间复杂度

所谓算法的时间复杂度,是指执行算法所需要的计算工作量。 
一个算法的空间复杂度,一般是指执行这个算法所需要的内存空间。

 

时间复杂度与空间复杂度详细讲解

 

**********************************************************************

//快速排序的优化

**********************************************************************

 

代码:

sort.h:

[cpp]  view plain copy print ?
  1. #ifndef SORT_H  
  2. #define SORT_H  
  3.   
  4. #include <vector>  
  5. #include "stdlib.h"  
  6.   
  7. using namespace std;  
  8.   
  9. namespace itlab  
  10. {  
  11.     template<typename Type> void bubbleSort(vector<Type>&, intint);  
  12.     template<typename Type> void selectSort(vector<Type>&, intint);  
  13.     template<typename Type> void insertSort(vector<Type>&, intint);  
  14.     template<typename Type> void quickSort(vector<Type>&, intint);  
  15.     template<typename Type> void mergSort(vector<Type>&, intint);  
  16.     template<typename Type> void heapSort(vector<Type>&, intint);  
  17.   
  18.     template<typename Type> const Type& median3(vector<Type>&, intint);  
  19.     template<typename Type> void merg(vector<Type>&, intintintint);  
  20.     template<typename Type> void filterDown(vector<Type>&, intint);  
  21.   
  22.     #include "Sort_impl.h"  
  23.   
  24.   
  25. }  
  26.   
  27. #endif  


sort_impl.h

[cpp]  view plain copy print ?
  1. /** 
  2.  * Bubble sort algorithm. 
  3.  * "a"      ---->   array of Comparable items. 
  4.  * "left"   ---->   the left-most index of the subarray. 
  5.  * "right"  ---->   the right-most index of the subarray. 
  6.  */  
  7. template<typename Type>   
  8. void bubbleSort( vector<Type> &a, int left, int right )  
  9. {  
  10.     for (int i=left; i<right; i++)  
  11.     {  
  12.         //若array有序,遍历一次,则sorted=true,直接跳出函数即可;  
  13.         bool sorted = true;  
  14.         for (int j=right; j>i; j--)  
  15.         {  
  16.             if (a[j] < a[j-1])  
  17.             {  
  18.                 swap(a[j],a[j-1]);  
  19.                 sorted = false;  
  20.             }  
  21.         }  
  22.         if (sorted)  
  23.         {  
  24.             return;  
  25.         }  
  26.     }  
  27. }  
  28.   
  29. /** 
  30.  * selection sort algorithm. 
  31.  * "a"      ---->   array of Comparable items. 
  32.  * "left"   ---->   the left-most index of the subarray. 
  33.  * "right"  ---->   the right-most index of the subarray. 
  34.  */  
  35. template<typename Type>  
  36. void selectSort( vector<Type> &a, int left, int right )  
  37. {  
  38.     for (int i=left; i<right; i++)  
  39.     {  
  40.         int minPos = i;  
  41.         for (int j=i+1; j<right; j++)  
  42.         {  
  43.             if (a[j]<a[minPos])  
  44.             {  
  45.                 minPos = j;  
  46.             }  
  47.         }  
  48.   
  49.         if (i!=minPos)  
  50.         {  
  51.             swap(a[i],a[minPos]);  
  52.         }  
  53.     }  
  54. }  
  55.   
  56. /** 
  57.  * Insertion sort algorithm. 
  58.  * "a"      ---->   array of Comparable items. 
  59.  * "left"   ---->   the left-most index of the subarray. 
  60.  * "right"  ---->   the right-most index of the subarray. 
  61.  */  
  62. template<typename Type>  
  63. void insertSort( vector<Type> &a, int left, int right )  
  64. {  
  65.   
  66.     for (int i=left+1; i<=right; i++)//one insertion;  
  67.     {  
  68.         Type tmp = a[i];  
  69.         int j;  
  70. //      for (j=i-1; j>=left && a[j]>tmp; j--)// insert a[i];  
  71. //      {  
  72. //          a[j+1] = a[j];  
  73. //      }  
  74. //      a[j+1]=tmp;  
  75.         for (j=i; j>left && a[j-1]>tmp; j--)  
  76.         {  
  77.             a[j] = a[j-1];  
  78.         }  
  79.         a[j] = tmp;  
  80.     }  
  81. }  
  82.   
  83. /** 
  84.  * Internal quicksort method that makes recursive calls. 
  85.  * Uses median-of-three partitioning and a cutoff of 20. 
  86.  * "a"      ---->   array of Comparable items. 
  87.  * "left"   ---->   the left-most index of the subarray. 
  88.  * "right"  ---->   the right-most index of the subarray. 
  89.  */  
  90. template <typename Type>  
  91. void quickSort( vector<Type> &a, int left, int right )  
  92. {  
  93.     if ( left+20 <= right)  
  94.     {  
  95.         Type pivot = median3(a, left, right);  
  96.   
  97.         //begin partitioning  
  98.         int i = left, j = right-1;  
  99.         for(;;)  
  100.         {  
  101.             while (a[++i] < pivot){ }  
  102.             while (pivot < a[--j]){ }  
  103.   
  104.             if (i < j)  
  105.                 swap(a[i], a[j]);  
  106.             else  
  107.                 break;  
  108.         }  
  109.         //Restore pivot  
  110.         swap(a[i], a[right-1]);//restore pivot;pivot的位置已经确定!下一步只对除a[i]外的两个子序列排序。i指向的肯定是第一个大于pivot的值  
  111.   
  112.         //sort small elements  
  113.         quickSort(a, left, i-1);  
  114.         //sort large elements  
  115.         quickSort(a, i+1, right);  
  116.   
  117.     }  
  118.     else  
  119.         insertSort(a,left,right);  
  120. }  
  121.   
  122. /** 
  123.  * Return median of left, center, and right. 
  124.  * Order these and hide the pivot. 
  125.  */  
  126. template <typename Type>  
  127. const Type& median3( vector<Type> &a, int left, int right )  
  128. {  
  129.     int center = (left + right) / 2;  
  130.     //顺序不能错;  
  131.     if (a[left] > a[center])  
  132.     {  
  133.         swap(a[left], a[center]);  
  134.     }  
  135.     if (a[left] > a[right])  
  136.     {  
  137.         swap(a[left], a[right]);  
  138.     }  
  139.     if (a[center] > a[right])  
  140.     {  
  141.         swap(a[center], a[right]);  
  142.     }  
  143.   
  144.     swap( a[center], a[right-1] );///////////////////////////  
  145.   
  146.     return a[right-1];  
  147.       
  148. }  
  149.   
  150. /** 
  151.  * Merg sort algorithm (nonrecursion). 
  152.  * "a"      ---->   array of Comparable items. 
  153.  * "left"   ---->   the left-most index of the subarray. 
  154.  * "right"  ---->   the right-most index of the subarray. 
  155.  */  
  156. template <typename Type>  
  157. void mergSort( vector<Type> &a, int left, int right )  
  158. {  
  159.     int left1, right1, left2, right2,  
  160.         n = right - left + 1,  
  161.         size = 1;  
  162.   
  163.     while( size < n )  
  164.     {  
  165.         left1 = left;  
  166.   
  167.         while( left1+size < n )  
  168.         {  
  169.             left2 = left1+size;  
  170.             right1 = left2-1;  
  171.             if( left2+size > n )  
  172.                 right2 = right;  
  173.             else  
  174.                 right2 = left2+size-1;  
  175.   
  176.             merg( a, left1, right1, left2, right2 );  
  177.   
  178.             left1 = right2+1;  
  179.         }  
  180.   
  181.         size *= 2;  
  182.     }  
  183.   
  184.   
  185. }  
  186.   
  187. /** 
  188.  * Merg two subsequence to a bigger one. 
  189.  * The first subsequence is a[left1] ... a[right1], and 
  190.  * The second subsqeuence is a[left2] ... a[right2]. 
  191.  */  
  192. template <typename Type>  
  193. void merg( vector<Type> &a, int left1, int right1, int left2, int right2 )  
  194. {  
  195.     int k = 0,  
  196.         i = left1,  
  197.         j = left2,  
  198.         n1 = right1-left1+1,  
  199.         n2 = right2-left2+1;  
  200.   
  201.     Type *tmp = new Type[n1+n2];  
  202. //开始并排  
  203.     while( i <= right1 && j <= right2 )  
  204.         if( a[i] < a[j] )  
  205.             tmp[k++] = a[i++];  
  206.         else  
  207.             tmp[k++] = a[j++];  
  208. //合并完成后,有个子序列还没排完  
  209.     while( i <= right1 )  
  210.         tmp[k++] = a[i++];  
  211.     while( j <= right2 )  
  212.         tmp[k++] = a[j++];  
  213. //重新放回序列  
  214.     forint i=0; i<n1; ++i )  
  215.         a[left1++] = tmp[i];  
  216.     forint i=0; i<n2; ++i )  
  217.         a[left2++] = tmp[n1+i];  
  218.   
  219.     delete []tmp;  
  220. }  
  221.   
  222. /** 
  223.  * Heap sort algorthm. 
  224.  * "a"      ---->   array of Comparable items. 
  225.  * "left"   ---->   the left-most index of the subarray. 
  226.  * "right"  ---->   the right-most index of the subarray. 
  227.  */  
  228. template <typename Type>  
  229. void heapSort(vector<Type> &a, int left, int right)  
  230. {  
  231.     int n = right-left+1;  
  232.     vector<Type> tmp(n);  
  233.     //assign value to tmp[]; sorting tmp[];  
  234.     for ( int i=0; i<n; i++)  
  235.     {  
  236.         tmp[i] = a[left+i];  
  237.     }  
  238.     //从第一个拥有孩子节点的位置n/2,开始排序,  
  239.     //从下向上,形成一个大根堆;  
  240.     for (int i=n/2; i>=0; i--)  
  241.     {  
  242.         filterDown(tmp, i, n);  
  243.     }  
  244.     //每循环一次,把大根与末尾元素互换;  
  245.     //然后从上到下排序一次,再次形成一个大根堆  
  246.     for (int j=n-1; j>=0; j--)  
  247.     {  
  248.         swap(tmp[0], tmp[j]);  
  249.         filterDown(tmp,0,j);  
  250.     }  
  251.     //assign sorted value to array  
  252.     for (int i=0; i<n; i++)  
  253.     {  
  254.         a[left+i] = tmp[i];  
  255.     }  
  256. }  
  257.   
  258. /** 
  259.  * Percolate down the heap. 
  260.  * "i"  ---->  the position from which to percolate down. 
  261.  * "n"  ---->  the logical size of the binary heap. 
  262.  */  
  263. template <typename Type>  
  264. void filterDown( vector<Type> &a, int i, int n )//a为待排序列,i为某个排序父节点位置,n为待排序列元素个数;  
  265. {  
  266.     int child;  
  267.     Type tmp;  
  268.   
  269.     for (tmp=a[i]; 2*i+1<n; i=child)  
  270.     {  
  271.         child = 2*i+1;  
  272.         if (child!=n-1 && a[child]<a[child+1])  
  273.         {  
  274.             child++;//找出孩子节点中最大的一个  
  275.         }  
  276.         if (tmp < a[child])  
  277.         {  
  278.             //a[i] = a[child];  
  279.             swap(a[i],a[child]);//若父节点小于孩子节点,则互换  
  280.         }  
  281.         else  
  282.             break;  
  283.     }  
  284. }  


sort.cpp

其中,C/C++生成随机数。

[cpp]  view plain copy print ?
  1. /***************************************************************************** 
  2.  *                                sort_test.cpp 
  3.  * 
  4.  * Sorting algorithm testing. 
  5.  * 
  6.  * 
  7.  *****************************************************************************/  
  8.   
  9.   
  10. #include <iostream>  
  11. #include<stdlib.h>  
  12. #include "sort.h"  
  13.   
  14. #include <random>  
  15.   
  16. using namespace std;  
  17. using namespace itlab;  
  18.   
  19.   
  20. #define random(x) (rand()%x)  
  21.   
  22.   
  23.   
  24. const int SIZE = 10;  
  25.   
  26.   
  27. template <typename Type>  
  28. void printVector( const vector<Type> &a )  
  29. {  
  30.     vector<int>::const_iterator itr = a.begin();  
  31.     while( itr != a.end() )  
  32.         cout << *itr++ << "\t";  
  33.   
  34.     cout << endl;  
  35. }  
  36.   
  37.   
  38. int main()  
  39. {  
  40.     vector<int> a( SIZE );  
  41.   
  42.     cout << "Unsorted Numbers : " << endl;  
  43.     for( unsigned i=0; i<a.size(); ++i )  
  44.         a[i] = random(100);  
  45.     printVector( a );  
  46.     cout << "Bubble Sorted Numbers : " << endl;  
  47.     bubbleSort( a, 0, a.size()-1 );  
  48.     printVector( a );  
  49.     cout << endl;  
  50.   
  51.     cout << "Unsorted Numbers : " << endl;  
  52.     for( unsigned i=0; i<a.size(); ++i )  
  53.         a[i] = random(100);  
  54.     printVector( a );  
  55.     cout << "Select Sorted Numbers : " << endl;  
  56.     selectSort( a, 0, a.size()-1 );  
  57.     printVector( a );  
  58.     cout << endl;  
  59.   
  60.     cout << "Unsorted Numbers : " << endl;  
  61.     for( unsigned i=0; i<a.size(); ++i )  
  62.         a[i] = random(100);  
  63.     printVector( a );  
  64.     cout << "Insert Sorted Numbers : " << endl;  
  65.     insertSort( a, 0, a.size()-1 );  
  66.     printVector( a );  
  67.     cout << endl;  
  68.   
  69.     cout << "Unsorted Numbers : " << endl;  
  70.     for( unsigned i=0; i<a.size(); ++i )  
  71.         a[i] = random(100);  
  72.     printVector( a );  
  73.     cout << "Quick Sorted Numbers : " << endl;  
  74.     quickSort( a, 0, a.size()-1 );  
  75.     printVector( a );  
  76.     cout << endl;  
  77.   
  78.     cout << "Unsorted Numbers : " << endl;  
  79.     for( unsigned i=0; i<a.size(); ++i )  
  80.         a[i] = random(100);  
  81.     printVector( a );  
  82.     cout << "Merg Sorted Numbers : " << endl;  
  83.     mergSort( a, 0, a.size()-1 );  
  84.     printVector( a );  
  85.     cout << endl;  
  86.   
  87.     cout << "Unsorted Numbers : " << endl;  
  88.     for( unsigned i=0; i<a.size(); ++i )  
  89.         a[i] = random(100);  
  90.     printVector( a );  
  91.     cout << "Heap Sorted Numbers : " << endl;  
  92.     heapSort( a, 0, a.size()-1 );  
  93.     printVector( a );  
  94.     cout << endl;  
  95.       
  96.     return 0;  
  97. }  


算法之美——排序算法总结_第2张图片

你可能感兴趣的:(算法之美——排序算法总结)