[C++] 排序 →→→→→进入此内容的聊天室

来自 , 2020-07-03, 写在 C++, 查看 106 次.
URL http://www.code666.cn/view/277a78fc
  1. void print(int a[], int n ,int i){  
  2.         cout<<i <<":  ";  
  3.         for(int j= 0; j<n; j++){  
  4.                 cout<<a[j] <<" ";  
  5.         }  
  6.         cout<<endl;  
  7. }  
  8. void swap(int& a, int& b)
  9. {
  10.         int temp = a;
  11.         a = b;
  12.         b = temp;
  13. }
  14. //直接插入排序
  15. void StraightInsertSort(int a[], int num)
  16. {
  17.         cout<<"StraightInsertSort "<<endl;  
  18.  
  19.         for (int i=1; i<num; i++)
  20.         {
  21.                 if (a[i] < a[i-1])      //插入元素小于前一个元素,向前插入
  22.                 {
  23.                         int x = a[i];
  24.                         int k = i-1;
  25.                         a[i] = a[i-1];
  26.                         while (x < a[k])        //依次向后移动
  27.                         {
  28.                                 a[k+1] = a[k];
  29.                                 k--;
  30.                         }
  31.                         a[k+1] = x;
  32.                 }
  33.                 print(a, num, i);
  34.         }
  35. }
  36. //希尔排序,改进直接插入排序
  37. void ShellInsertSort(int a[], int num, int dk)
  38. {
  39.         cout<<"dk= "<<dk<<endl;  
  40.  
  41.         for (int i=dk; i<num; i++)
  42.         {
  43.                 if (a[i] < a[i-dk])
  44.                 {
  45.                         int x = a[i];
  46.                         int k = i - dk;
  47.                         a[i] = a[k];
  48.                         while (x < a[k])
  49.                         {
  50.                                 a[k+dk] = a[k];
  51.                                 k -= dk;
  52.                         }
  53.                         a[k+dk] = x;
  54.                 }
  55.                 print(a, num, i);
  56.         }
  57. }
  58. void ShellSort(int a[], int num)
  59. {
  60.         cout<<"ShellInsertSort "<<endl;  
  61.  
  62.         int dk = num/2;
  63.         while (dk >= 1)
  64.         {
  65.                 ShellInsertSort(a, num, dk);
  66.                 dk /= 2;
  67.         }
  68. }
  69.  
  70. //简单选择排序
  71. void SimpleSelectSort(int a[], int num)
  72. {
  73.         for (int i=0; i<num; i++)
  74.         {
  75.                 int minNum = a[i];
  76.                 int pos = -1;
  77.                 for (int k=i+1; k<num; k++)
  78.                 {
  79.                         if (minNum > a[k])
  80.                         {
  81.                                 minNum = a[k];
  82.                                 pos = k;
  83.                         }
  84.                 }
  85.                 if (pos != -1)
  86.                 {
  87.                         a[pos] = a[i];
  88.                         a[i] = minNum;
  89.                 }
  90.                 print(a, num, i);
  91.         }
  92. }
  93. //双向选择排序
  94. void SelectionExSort(int a[], int num)
  95. {
  96.         for (int i=1; i<=num/2; i++)
  97.         {
  98.                 int maxPos = i-1;
  99.                 int minPos = num-i;
  100.                 for (int k=i+1; k<num-i; k++)
  101.                 {
  102.                         if (a[maxPos] < a[k])
  103.                         {
  104.                                 maxPos = k;
  105.                         }
  106.                         if (a[minPos] > a[k])
  107.                         {
  108.                                 minPos = k;
  109.                         }
  110.                 }
  111.                 if (a[minPos] < a[i-1])
  112.                 {
  113.                         swap(a[minPos], a[i-1]);
  114.                 }
  115.  
  116.                 if (a[maxPos] > a[num-i])
  117.                 {
  118.                         swap(a[maxPos], a[num-i]);
  119.                 }
  120.  
  121.                 print(a, num, i);
  122.         }
  123. }
  124.  
  125. //冒泡排序
  126. void BubbleSort(int a[], int num)
  127. {
  128.         for (int i=0; i<num; i++)
  129.         {
  130.                 for (int k=0; k<num-1-i; k++)
  131.                 {
  132.                         if (a[k] > a[k+1])
  133.                         {
  134.                                 swap(a[k], a[k+1]);
  135.                         }
  136.                 }
  137.                 print(a, 10, i);
  138.         }
  139. }
  140. //简化冒泡排序,如果之后有序,不在排列
  141. void BubbleSort_1(int a[], int num)
  142. {
  143.         int endPos = num-1;
  144.         int i = 0;
  145.         while (endPos > 0)
  146.         {
  147.                 int pos = 0;
  148.                 for (int k=0; k<endPos; k++)
  149.                 {
  150.                         if (a[k] > a[k+1])
  151.                         {
  152.                                 pos = k;
  153.                                 swap(a[k], a[k+1]);
  154.                         }
  155.                 }
  156.                 endPos = pos;
  157.                 print(a, 10, i++);
  158.         }
  159. }
  160. //双向冒泡排序
  161. void BubbleSort_2(int a[], int num)
  162. {
  163.         int lowPos = 0;
  164.         int highPos = num-1;
  165.         int k;
  166.         int i = 0;
  167.         while (lowPos < highPos)
  168.         {
  169.                 for (k=lowPos; k<highPos; k++)
  170.                 {
  171.                         if (a[k] > a[k+1])
  172.                         {
  173.                                 swap(a[k], a[k+1]);
  174.                         }
  175.                 }
  176.                 highPos--;
  177.                 print(a, 10, i);
  178.                 for (k=highPos; k>lowPos; k--)
  179.                 {
  180.                         if (a[k] < a[k-1])
  181.                         {
  182.                                 swap(a[k], a[k-1]);
  183.                         }
  184.                 }
  185.                 lowPos++;
  186.                 print(a, 10, i++);
  187.         }
  188. }
  189.  
  190. static int i = 0;
  191. //快速排序
  192. void QuickSort(int a[], int low, int high)
  193. {
  194.         if (low >= high)
  195.         {
  196.                 return;
  197.         }
  198.         int first = low;
  199.         int last = high;
  200.         int key = a[low];
  201.         while (first < last)
  202.         {
  203.                 while (first < last && a[last] >= key)
  204.                 {
  205.                         last--;
  206.                 }
  207.                 a[first] = a[last];
  208.                 while (first < last && a[first] <= key)
  209.                 {
  210.                         first++;
  211.                 }
  212.                 a[last] = a[first];
  213.         }
  214.         a[first] = key;
  215.         print(a, 10, i++);
  216.         QuickSort(a, low, first-1);
  217.         QuickSort(a, first+1, high);
  218. }
  219.  
  220. //归并排序
  221. void Merge(int sourceArr[],int tempArr[],int startIndex,int midIndex,int endIndex)
  222. {
  223.         int i = startIndex,j=midIndex+1,k = startIndex;
  224.         while(i!=midIndex+1 && j!=endIndex+1)
  225.         {
  226.                 if(sourceArr[i]<sourceArr[j])
  227.                         tempArr[k++] = sourceArr[i++];
  228.                 else
  229.                         tempArr[k++] = sourceArr[j++];
  230.         }
  231.         while(i!=midIndex+1)
  232.                 tempArr[k++] = sourceArr[i++];
  233.         while(j!=endIndex+1)
  234.                 tempArr[k++] = sourceArr[j++];
  235.         for(i=startIndex;i<=endIndex;i++)
  236.                 sourceArr[i] = tempArr[i];
  237. }
  238. //内部使用递归
  239. void MergeSort(int sourceArr[],int tempArr[],int startIndex,int endIndex)
  240. {
  241.         int midIndex;
  242.         if(startIndex<endIndex)
  243.         {
  244.                 midIndex=(startIndex+endIndex)/2;
  245.                 MergeSort(sourceArr,tempArr,startIndex,midIndex);
  246.                 MergeSort(sourceArr,tempArr,midIndex+1,endIndex);
  247.                 Merge(sourceArr,tempArr,startIndex,midIndex,endIndex);
  248.         }
  249.         print(sourceArr, 10, i++);
  250. }

回复 "排序"

这儿你可以回复上面这条便签

captcha