O(n^2) 排序算法汇总

时间:2022-07-26 04:33:59

O(n^2)

选择排序

   
   
  
  
  1. #include <iostream>
  2. using namespace std;
  3. template <typename T>
  4. void selectionSort(T arr[], int n){
  5. for(int i = 0; i < n; i++){
  6. int minIndex = i;
  7. for(int j = i + 1; j < n; j++){
  8. if( arr[j] < arr[minIndex] )
  9. minIndex = j;
  10. }
  11. swap(arr[minIndex], arr[i]);
  12. }
  13. }

插入排序

   
   
  
  
  1. #include <iostream>
  2. using namespace std;
  3. template <typename T>
  4. void insertionSort(T arr[], int n){
  5. // for(int i = 1; i < n; i++){
  6. //
  7. // for(int j = i; j > 0 && arr[j] < arr[j-1]; j--){
  8. // swap( arr[j], arr[j-1] );
  9. // }
  10. // }
  11. //插入排序优化------将交换改为赋值
  12. for(int i = 1; i < n; i++){
  13. T e = arr[i];
  14. int j; //j存放元素e应该插入的位置
  15. for(j = i; j > 0 && arr[j-1] > e; j--){
  16. arr[j] = arr[j-1];
  17. }
  18. arr[j] = e;
  19. }
  20. }

冒泡排序

   
   
  
  
  1. #include <iostream>
  2. using namespace std;
  3. template<typename T>
  4. void old_bubbleSort(T arr[], int n){
  5. for(int i = 0; i < n; i++){
  6. for(int j = n - 1; j > 0; j--){
  7. if( arr[j] < arr[j-1] )
  8. swap(arr[j], arr[j-1]);
  9. }
  10. }
  11. return;
  12. }
  13. template<typename T>
  14. void bubbleSort( T arr[], int n){
  15. // 基础冒泡排序
  16. // 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  17. // 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  18. // 针对所有的元素重复以上的步骤,除了最后一个。
  19. // 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
  20. // for(int i = 0; i < n; i++){
  21. // for(int j = n - 1; j > 0; j--){
  22. // if( arr[j] < arr[j-1] )
  23. // swap(arr[j], arr[j-1]);
  24. // }
  25. // }
  26. //冒泡排序优化(借鉴插入排序--可以提前结束)
  27. bool flag = true;
  28. for(int i = 0; i < n && flag; i++){
  29. flag = false;
  30. for(int j = n-1; j > 0; j--){
  31. if(arr[j] < arr[j-1]){
  32. swap(arr[j], arr[j-1]);
  33. flag = true;
  34. }
  35. }
  36. }
  37. return;
  38. }

希尔排序-----插入排序的衍生(最优到O(n^(3/2)))

   
   
  
  
  1. #include <iostream>
  2. using namespace std;
  3. template<typename T>
  4. void shellSort( T arr[], int n ){
  5. int h = 1;
  6. while( h < n/3 )
  7. h = 3 * h + 1;
  8. // 计算 increment sequence: 1, 4, 13, 40, 121, 364, 1093...
  9. while( h >= 1 ){
  10. // h-sort the array
  11. for( int i = h ; i < n ; i ++ ){
  12. // 对 arr[i], arr[i-h], arr[i-2*h], arr[i-3*h]... 使用插入排序
  13. T e = arr[i];
  14. int j;
  15. for( j = i ; j >= h && e < arr[j-h] ; j -= h )
  16. arr[j] = arr[j-h];
  17. arr[j] = e;
  18. }
  19. h /= 3;
  20. }
  21. return;
  22. }