排序算法总结-插入排序、希尔排序、堆排序、快速排序

来源:互联网 发布:java中格式化日期 编辑:程序博客网 时间:2024/05/08 08:33

今天去面试被问到了自己知道哪些排序算法,虽然答了一堆,但是想想会的真没几个,所以回来后这里将几个(自认为)重要的写在这里。

1、插入排序

 

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. //插入排序  
  2. //原理:前i项是排过序的,将当前元素插入到前面已经排过序的序列中  
  3. //时间界:O(N2)  
  4. template <</SPAN>typename Comparable>  
  5. void insertionSort(vector &a){  
  6.     forsize_t i = 1; i < a.size(); i++){  
  7.         Comparable temp = a[i];  
  8.         int j;  
  9.         for(j = i; j > 0 && temp < a[j - 1]; j--){  
  10.             //如果当前待插入的元素小于前面的元素,  
  11.             //则依次后移  
  12.             a[j] = a[j - 1];  
  13.         }  
  14.         //将当前带插入元素放到循环退出的位置  
  15.         //即前面的元素没有他大,或者j已经到了第一个位置  
  16.         a[j] = temp;  
  17.     }  
  18. }  

2、希尔排序

 

 

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. //希尔排序  
  2. //原理:所有相隔某个增量的元素都被排序  
  3. //时间界与选取的增量序列相关,一般好于插入排序,但大于NlogN  
  4. int getGap(int num){  
  5.     int power = 0;  
  6.     while((num/=2) > 0){  
  7.         power++;  
  8.     }  
  9.   
  10.     return (int)pow((double)2,(double)power);  
  11. }  
  12. template<</SPAN>typename Comparable>  
  13. void shellSort(vector &v){  
  14.     //这里选取增量序列为1,3,7,...,pow(2,k)-1  
  15.     int gap = getGap(v.size());  
  16.     for(; gap > 0; gap = gap/2 - 1){  
  17.         forsize_t i = gap; i < v.size(); i++){  
  18.             Comparable temp = v[i];  
  19.             int j = i;  
  20.             //我感觉这里跟插入排序是一样的,插入排序可以理解为gap是1的情况。  
  21.             for(j = i; j >= gap && temp < v[j - gap]; j -= gap)  
  22.                 v[j] = v[j - gap];  
  23.             v[j] = temp;  
  24.         }  
  25.     }  
  26. }  

3、堆排序

 

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. //堆排序  
  2. //根据二叉堆而来,这里用最大堆,即根的键值比其儿子的键值大  
  3. //通过deleteMax操作得到排序后的序列  
  4. template<</SPAN>typename Comparable>  
  5. //下率操作  
  6. void percDown(vector &v, int current, int n){  
  7.     Comparable temp;  
  8.     int child;  
  9.     for( temp = v[current]; 2*current < n; current = child){  
  10.         child = 2*current;  
  11.         //找到最大的孩子  
  12.         if( child + 1 < n && v[child] < v[child+1])  
  13.             child++;  
  14.   
  15.         //如果最大的孩子比父亲大,则交换,否则找到了正确的位置退出  
  16.         if( v[child] > temp)  
  17.             v[current] = v[child];  
  18.         else  
  19.             break;  
  20.     }  
  21.     //将传进来的位置上的键值放到找到的位置  
  22.     v[current] = temp;  
  23. }  
  24.   
  25. template<</SPAN>typename Comparable>  
  26. void heapSort(vector &v){  
  27.     forint i = v.size()/2; i >= 0; i--){  
  28.         percDown(v, i, v.size());  
  29.     }  
  30.   
  31.     for(size_t j = v.size() - 1; j > 0; j--){  
  32.         //这里将最大的值与最后一个元素互换,即deleteMax操作  
  33.         Comparable temp = v[0];  
  34.         v[0] = v[j];  
  35.         v[j] = temp;  
  36.         //然后对根处的元素进行下率  
  37.         percDown( v, 0, j);  
  38.     }  
  39. }  


 


4、快速排序

 

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. //快速排序  
  2. //主要需要找到枢纽元,然后对其进行分段排序  
  3. //找到枢纽元的方法可以自己进行各种改进  
  4. template<</SPAN>typename Comparable>  
  5. void swap(vector &v, int i, int j){  
  6.     Comparable temp = v[i];  
  7.     v[i] = v[j];  
  8.     v[j] = temp;  
  9. }  
  10. template<</SPAN>typename Comparable>  
  11. int getPivot(vector &v, int low, int high){  
  12.     int middle = (low + high)/2;  
  13.   
  14.     if( v[low] > v[middle]){  
  15.         swap(v, low, middle);  
  16.     }  
  17.     if( v[low] > v[high]){  
  18.         swap(v, low, high);  
  19.     }  
  20.     if( v[middle] > v[high]){  
  21.         swap(v, middle, high);  
  22.     }  
  23.   
  24.     //这里将选出的中间值放在倒数第二个位置,因为最后一个不用再筛选了,他肯定比中间值大  
  25.     swap(v, middle, high - 1);  
  26.   
  27.     return v[high - 1];  
  28. }  
  29. template<</SPAN>typename Comparable>  
  30. void quickSort(vector &v, int low, int high){  
  31.     if( low >= high)  
  32.         return;  
  33.   
  34.     Comparable pivot = getPivot( v, low, high);  
  35.   
  36.     int l = low;  
  37.     int r = high - 1;  
  38.     while(1){  
  39.         //当遇到不满足条件的元素时,l和r分别指向他们  
  40.         while(v[++l] < pivot){}  
  41.         while(v[--r] > pivot){}  
  42.   
  43.         if( l < r){  
  44.             swap( v, l, r);  
  45.         }else{  
  46.             break;  
  47.         }  
  48.     }  
  49.     //将枢纽元放置到结束的地方  
  50.     swap(v, l, high - 1);  
  51.     quickSort( v, low, l -1);  
  52.     quickSort( v, l + 1, high);  
  53. }  


 

今天就写到这里吧,上面的我都试了一下可以正常工作。睡觉了

0 0
原创粉丝点击