八种常用的排序算法

来源:互联网 发布:铁路定额预算软件 编辑:程序博客网 时间:2024/05/29 02:36
  1. //1.插入排序  
  2. void InsertSort(int* a, int n)//直接插入  
  3. {  
  4.     for (int i =0; i<n-1;i++)  
  5.     {  
  6.         int tmp;  
  7.         int end = i;          //关键字位置  
  8.         tmp = a[end + 1];     //保存后一个元素  
  9.         while (end>=0)  
  10.         {  
  11.             if (a[end]>tmp)  //前一个大于后一个  
  12.             {      
  13.                 a[end + 1] = a[end];     //前一个挪到后面  
  14.                 --end;  
  15.             }                  //关键字向前移  
  16.             else{  
  17.                 break;  
  18.             }  
  19.         }  
  20.         a[end + 1] = tmp;  
  21.     }}  

  1. //希尔排序  
  2. void ShellSort(int* a, int n)   //gap //希尔    
  3. {  
  4.     int gap = n;  
  5.     while (gap>1)  
  6.     {  
  7.         gap=gap/3+1;  
  8.         for (int i = 0; i < n-gap;i++)  
  9.         {  
  10.             int tmp;  
  11.             int end = i;  
  12.             tmp = a[end + gap];     //保存后一个元素  
  13.             while (end>=0){  
  14.                 if (a[end]>tmp){      //前一个大于后一个  
  15.                     a[end + gap] = a[end];     //前一个挪到后面  
  16.                     --end;  
  17.                 }                  //关键字向前移  
  18.                 else{  
  19.                     break;  
  20.                 }  
  21.             }  
  22.             a[end + gap] = tmp;  
  23.         }     
  24.         }  
  25.     }  

  1. //选择排序  
  2. void SeleteSort1(int* a, int n)//选择排序  
  3. {  
  4.     int  min,i ;  
  5.     for (i = 0; i < n;i++)  
  6.     {  
  7.         min = i;  
  8.         for (int j = i + 1; j < n;j++)  
  9.         {  
  10.             if (a[j]<=a[min])  
  11.             {  
  12.                 min = j;  
  13.             }  
  14.         }  
  15.         swap(a[min], a[i]);  
  16.     }  
  17. }  
  18. void SeleteSort2(int* a, int n)  //选择排序的优化算法  
  19. {  
  20.     int max, min, i, j;  
  21.     for (i =1; i <=n / 2;i++)  
  22.     {  
  23.         min = i; max = i;    //记录最大值最小值位置  
  24.         for (j = i + 1; j <=n-i;j++)  
  25.         {  
  26.             if (a[j] >a[max])  
  27.             {  
  28.                 max = j;  
  29.             }     
  30.             if (a[j] <a[min])  
  31.             {  
  32.                 min = j;  
  33.             }  
  34.         }  
  35.         swap(a[i], a[min]);    
  36.         swap(a[n-i], a[max]);         
  37.     }  
  38. }  

  1. //堆排序  
  2. void AdjustHeap(int *a, int root, int len)  
  3. {  
  4.     int parent = root;  
  5.     int child = 2 * parent + 1;  
  6.     while (child<len)  
  7.     {  
  8.         if (child+1<len&&a[child]<a[child+1])  
  9.         {  
  10.             ++child;  
  11.         }  
  12.         if (a[parent]<a[child])  
  13.         {  
  14.             swap(a[parent],a[child]);  
  15.             parent= child;  
  16.             child = 2 * parent + 1;  
  17.         }  
  18.         else  
  19.         {  
  20.             break;  
  21.         }  
  22.     }  
  23. }  
  24. void BulidHeap(int * a, int len)  
  25. {  
  26.     for (int i = (len - 1) / 2; i >= 0; i--)  
  27.     {  
  28.         AdjustHeap(a, i, len);  
  29.     }  
  30. }  
  31. void HeapSort(int* a, int len)  
  32. {  
  33.     BulidHeap(a, len);  
  34.     for (int i = len - 1; i > 0;i--)  
  35.     {  
  36.         int temp = a[i]; a[i] = a[0]; a[0] = temp;  
  37.         AdjustHeap(a,0, i);  
  38.     }  
  39. }  

  1. //冒泡排序  
  2. void BubbleSort(int* a,int len)  
  3. {  
  4.     for (int i= 0; i < len;i++)  
  5.    {  
  6.         for (int j = 0; j < len - i-1;j++)  
  7.         {  
  8.             if (a[j]>a[j+1])  
  9.             {  
  10.                 swap(a[j],a[j+1]);  
  11.             }  
  12.         }  
  13.    }  
  14. }  

  1. //快速排序  
  2.   
  3. int GetMidIndex(int* a, int left, int right)  //发挥中间坐标  
  4. {  
  5.     int mid = left+(left - right) / 2;  
  6.     if (a[left]<a[mid])  
  7.     {  
  8.         if (a[mid]<a[right])  
  9.         {  
  10.             return mid;  
  11.         }  
  12.         else if (a[left]>a[right])  
  13.         {  
  14.             return left;  
  15.         }  
  16.         else  
  17.             return right;  
  18.     }  
  19.     else  //left>mid  
  20.     {  
  21.         if (a[mid]>a[right])  
  22.         {  
  23.             return mid;  
  24.         }  
  25.         else if (a[left] < a[right])  
  26.         {  
  27.             return left;  
  28.         }  
  29.         else  
  30.             return right;  
  31.     }  
  32.   
  33. }  
  34. int   PartSort1(int* a, int left, int right)  
  35. {  
  36.     int mid = GetMidIndex(a, left,right);  
  37.     swap(a[mid],a[right]);  
  38.     int key = a[right];  
  39.     int begin = left;  
  40.     int end = right;  
  41.     while (begin < end)  
  42.     {  
  43.         while (begin<end&&a[begin]<=key)  
  44.         {  
  45.             ++begin;  
  46.         }  
  47.         while (begin<end&&a[end]>=key)  
  48.         {  
  49.             --end;  
  50.         }  
  51.         if (begin < end)  
  52.     swap(a[begin], a[end]);  
  53.     }  
  54.    
  55.         swap(a[begin],a[right]);  
  56.         return begin;  
  57. }  
  58. void QuickSort(int* a, int left, int right)  
  59. {  
  60.     assert(a);  
  61.   
  62.     if (left >= right)  
  63.         return;  
  64.   
  65.     if (right - left < 5)  
  66.     {  
  67.         InsertSort(a + left, right - left + 1);  
  68.     }  
  69.     else  
  70.     {  
  71.         int div = PartSort1(a, left, right);  
  72.         QuickSort(a, left, div - 1);  
  73.         QuickSort(a, div + 1, right);  
  74.     }  
  75. }  

  1. //归并排序  
  2. void  Merge(int* a, int* tmp, int begin1, int end1, int begin2, int end2)  
  3. {  
  4.     int pos = begin1;  
  5.     int index = begin1;  
  6.     while (begin1<=end1&&begin2<=end2)  
  7.     {  
  8.         if (a[begin1]<a[begin2])  
  9.         {  
  10.             tmp[index++] = a[begin1++];  
  11.         }  
  12.         else  
  13.         {  
  14.             tmp[index++] = a[begin2++];  
  15.         }  
  16.   
  17.     }  
  18.     while (begin1<=end1)  
  19.     {  
  20.         tmp[index++] = a[begin1++];  
  21.     }  
  22.     while (begin2<=end2)  
  23.     {  
  24.         tmp[index++] = a[begin2++];  
  25.     }  
  26.     memcpy(a+pos,tmp+pos,sizeof(int)*(end2-pos+1));  
  27. }  
  28. void _MergeSort(int* a,int* tmp,int left,int right)  
  29. {  
  30.    if (left>=right)  
  31.    {  
  32.        return;  
  33.    }  
  34.    int mid = left + (right-left) / 2;  
  35.    _MergeSort(a,tmp,left,mid);  
  36.    _MergeSort(a, tmp, mid + 1, right);  
  37.    Merge(a, tmp, left, mid, mid + 1, right);  
  38. }  
  39. void MergeSort(int* a, int len)  
  40. {  
  41.     assert(a);  
  42.     int* tmp = new int[len];  
  43.     _MergeSort(a,tmp,0,len-1);  
  44.     delete[]  tmp;  
  45. }  
  46. void RadixSort(int* a, int len,int maxradix)  
  47. {  
  48.     assert(a);  
  49.     int n=0,lsp=0;  
  50.     int k = 1, m = 1;  
  51.     int tmp[10][10] = {0};  
  52.     while (k<maxradix)  
  53.     {  
  54.         for (int i = 0; i < len;i++)  
  55.      {  
  56.             if (a[i]<m)  
  57.             {  
  58.                 tmp[0][n] = a[i];  
  59.             }  
  60.             else  
  61.             {  
  62.                 lsp = (a[i] / 10) % 10;  
  63.                 tmp[lsp][n] = a[i];  
  64.             }  
  65.             n++;  
  66.      }  
  67.   
  68.     }  
  69. }  

  1. //基数排序  
  2. int  GetNumInPos(int num, int pos)  
  3. {  
  4.     int tmp = 1;  
  5.     for (int i = 0; i < pos-1;i++)  
  6.     {  
  7.         tmp *= 10;  
  8.     }  
  9.     return (num / tmp) % 10;  
  10. }  
  11. void RadixSort(int* a, int len)  
  12. {  
  13.     int* RadixArray[RADIX_10];  
  14.     for (int i = 0; i < 10;i++)  
  15.     {  
  16.         RadixArray[i] = (int *)malloc(sizeof(int)* (len + 1));  
  17.         RadixArray[i][0] = 0;  
  18.     }  
  19.     for (int pos = 1; pos <= KEYNUM_31;pos++)  
  20.     {  
  21.         for (int i = 0; i < len;i++)  
  22.         {  
  23.             int num = GetNumInPos(a[i], pos);  
  24.             int index = ++RadixArray[num][0];  
  25.             RadixArray[num][index] = a[i];  
  26.         }  
  27.         for (int j = 0,i=0; i<RADIX_10 ;i++)  
  28.         {  
  29.             for (int k = 1; k < RadixArray[i][0];k++)  
  30.            {  
  31.                 a[j++] = RadixArray[i][k];  
  32.                 RadixArray[i][0] = 0;  
  33.            }  
  34.         }  
  35.     }  
  36. }  
  37. void Display(int* a, int n)  
  38. {  
  39.     for (int i = 0; i < n;i++)  //18392078917  
  40.     {  
  41.         cout << a[i] <<"   ";  
  42.     }  
  43.     cout << endl;  
  44. }  
  45. void TestInsertSort()  
  46. {  
  47.     int a[] = { 2, 1, 3, 4, 7, 4, 6, 8, 9, 10 };  
  48.     Display(a, sizeof(a) / sizeof(a[0]));  
  49.     InsertSort(a, sizeof(a) / sizeof(a[0]));  
  50.     Display(a, sizeof(a) / sizeof(a[0]));  
  51. }  
  52. void TestShellSort()  
  53. {  
  54.     int a[] = { 1, 3, 4, 5, 4, 6, 8, 9, 10 };  
  55.     Display(a, sizeof(a) / sizeof(a[0]));  
  56.     ShellSort(a, sizeof(a) / sizeof(a[0]));  
  57.     Display(a, sizeof(a) / sizeof(a[0]));  
  58. }  
  59. void TestSeleteSort()  
  60. {  
  61.     int a[] = { 11, 3, 30, 5, 4,60, 5, 9, 10 };  
  62.     Display(a, sizeof(a) / sizeof(a[0]));  
  63.     SeleteSort1(a, sizeof(a) / sizeof(a[0]));  
  64.     Display(a, sizeof(a) / sizeof(a[0]));  
  65.     SeleteSort2(a, sizeof(a) / sizeof(a[0]));  
  66.     Display(a, sizeof(a) / sizeof(a[0]));  
  67. }  
  68. void TestHeapSort()  
  69. {  
  70.     int a[] = {3,1,4,2,5,8,6,9,7,10};  
  71.     Display(a, sizeof(a) / sizeof(a[0]));  
  72.     int len = sizeof(a) / sizeof(a[0]);  
  73.     HeapSort(a, len);  
  74.     Display(a, sizeof(a) / sizeof(a[0]));  
  75. }  
  76. void TestBubbleSort()  
  77. {  
  78.     int a[] = { 3, 1, 4, 2, 5, 4, 6, 9, 7, 10 };  
  79.     Display(a, sizeof(a) / sizeof(a[0]));  
  80.     int len = sizeof(a) / sizeof(a[0]);  
  81.     BubbleSort(a, len);  
  82.     Display(a, sizeof(a) / sizeof(a[0]));  
  83. }  
  84. void TestQuickSort()  
  85. {  
  86.     int a[] = { 3, 1, 4, 2, 5, 4, 6, 9, 7, 10 };  
  87.     Display(a, sizeof(a) / sizeof(a[0]));  
  88.     int len = sizeof(a) / sizeof(a[0]);  
  89.     QuickSort(a, 0, len-1);  
  90.     Display(a, sizeof(a) / sizeof(a[0]));  
  91. }  
  92. void TestMergeSort()  
  93. {  
  94.     int a[] = { 3, 1, 4, 2, 5, 4, 6, 9, 7, 10 };  
  95.     Display(a, sizeof(a) / sizeof(a[0]));  
  96.     int len = sizeof(a) / sizeof(a[0]);  
  97.     MergeSort(a, sizeof(a) / sizeof(a[0]));  
  98.     Display(a, sizeof(a) / sizeof(a[0]));  
  99. }  
  100. void TestRadixSort()  
  101. {  
  102.     int a[] = { 12, 13, 12, 13, 19, 18, 15, 12, 15, 16, 17 };  
  103.     int len = sizeof(a) / sizeof(a[0]);  
  104.     Display(a, len);  
  105.     RadixSort(a, len);  
  106.     Display(a, len);  
  107. }  
原创粉丝点击