排序方法

1、简单的选择排序n^2

 

void simple( vector<int> &a)
{   
    for (auto it = a.begin(); it != a.end(); it++)
    {
        for (auto it1 = it+1; it1 != a.end(); it1++)
        {
            if (*it1<*it)
            {
                int a = *it;
                *it = *it1;
                *it1 = a;
            }
        }
    }

}

2、冒泡n^2

void bubbleSort(vector<int> &a)
{
    for (auto it = a.begin(); it != a.end()-1; it++)
    {
        for (auto it1 = a.begin(); it1 <a.begin()+( a.end()-it)-1; it1++)
        {
            vector<int>::iterator it2 = it1+1;
            if (*it2<*it1)
            {
                int a = *it1;
                *it1 = *it2;
                *it2 = a;
            }
        }
    }
}

3、插入排序n^2

void insertSort(vector<int> &a)
{
    for (auto it = a.begin()+1; it != a.end(); it++)
    {
        
            
            while (a.begin()<it)
            {
                vector<int>::iterator it2 = it - 1;
                if (*it2>*it)
                {
                    int a = *it;
                    *it = *it2;
                    *it2 = a;
                    
                }
                else
                {
                    break;
                }
                --it;
            }
            
        
    }
}

4、快速排序N*logN

void quick_sort(int s[], int l, int r)
{
    if (l < r)
    {
        //Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换 参见注1
        int i = l, j = r, x = s[l];
        while (i < j)
        {
            while (i < j && s[j] >= x) // 从右向左找第一个小于x的数
                j--;
            if (i < j)
                s[i++] = s[j];

            while (i < j && s[i] < x) // 从左向右找第一个大于等于x的数
                i++;
            if (i < j)
                s[j--] = s[i];
        }
        s[i] = x;
        quick_sort(s, l, i - 1); // 递归调用
        quick_sort(s, i + 1, r);
    }
}

5、堆排序n*LOGn

堆排序

  堆排序是利用这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。首先简单了解下堆结构。

  堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。如下图:

同时,我们对堆中的结点按层进行编号,将这种逻辑结构映射到数组中就是下面这个样子

该数组从逻辑上讲就是一个堆结构,我们用简单的公式来描述一下堆的定义就是:

大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]  

小顶堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]  

ok,了解了这些定义。接下来,我们来看看堆排序的基本思想及基本步骤:

堆排序基本思想及步骤

  堆排序的基本思想是:将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了

步骤一 构造初始堆。将给定无序序列构造成一个大顶堆(一般升序采用大顶堆,降序采用小顶堆)。

  a.假设给定无序序列结构如下

2.此时我们从最后一个非叶子结点开始(叶结点自然不用调整,第一个非叶子结点 arr.length/2-1=5/2-1=1,也就是下面的6结点),从左至右,从下至上进行调整。

4.找到第二个非叶节点4,由于[4,9,8]中9元素最大,4和9交换。

这时,交换导致了子根[4,5,6]结构混乱,继续调整,[4,5,6]中6最大,交换4和6。

此时,我们就将一个无需序列构造成了一个大顶堆。

步骤二 将堆顶元素与末尾元素进行交换,使末尾元素最大。然后继续调整堆,再将堆顶元素与末尾元素交换,得到第二大元素。如此反复进行交换、重建、交换。

a.将堆顶元素9和末尾元素4进行交换

b.重新调整结构,使其继续满足堆定义

c.再将堆顶元素8与末尾元素5进行交换,得到第二大元素8.

后续过程,继续进行调整,交换,如此反复进行,最终使得整个序列有序

再简单总结下堆排序的基本思路:

  a.将无需序列构建成一个堆,根据升序降序需求选择大顶堆或小顶堆;

  b.将堆顶元素与末尾元素交换,将最大元素"沉"到数组末端;

  c.重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素,反复执行调整+交换步骤,直到整个序列有序。

 

 

常用排序算法的时间复杂度和空间复杂度表格

 

1.选择排序

思想:每次找一个最小值。

 

 
  1. #include <iostream>

  2. using namespace std;

  3. //从小到大排序

  4. void SelectSort(int a[], int n)

  5. {

  6. int index, temp;

  7. for (int i = 0; i < n - 1; i++) //执行(n-1) 次

  8. {

  9. index = i;

  10. for (int j = i + 1; j<n; j++)//执行(n-1)次 每个a[i]都要与a[i+1]至a[n-1]做比较

  11. {

  12. if (a[index] > a[j]) //记录序列中最小值的位置

  13. {

  14. index = j;

  15. }

  16. }

  17. if (index != i) //如果无序序列中第一个记录不是最小值,则进行交换

  18. {

  19. temp = a[index];

  20. a[index] = a[i];

  21. a[i] = temp;

  22. }

  23. }

  24. }

  25. int main()

  26. {

  27. int a[10], i, n = 10, num = 10;

  28. for (i = 0; i < n; i++)

  29. a[i] = num--;

  30. cout << "原序列:\n";

  31. for (i = 0; i < n; i++)

  32. cout << a[i] << " ";

  33. SelectSort(a, n); cout << "排序后:\n"; for (i = 0; i < n; i++)cout << a[i] << " ";

  34. return 0;

  35. }

  36. //优化排序

  37. //如果在每一次查找最小值的时候,也可以找到一个最大值,然后将两者分别放在它们应该出现的位置,这样遍历的次数就比较少了,下边

  38. //给出代码实现:

  39. void SelectSort2(int a[], int n)

 
  1. {

  2. int left = 0; int right = n - 1; int min = left;//存储最小值的下标

  3. int max = left;//存储最大值的下标

  4. while (left <= right)

  5. {

  6. min = left;

  7. max = left;

  8. for (int i = left; i <= right; ++i)

  9. {

  10. if (a[i] < a[min])

  11. min = i;

			if (a[i] > a[max])
 
  1. max = i;

  2. }

  3. swap(a[left], a[min]);

  4. if (left == max)

  5. max = min;

  6. swap(a[right], a[max]);

  7. ++left;

  8. --right;

  9. }

  10. }

  11. //递归版

  12. void RecursiveSelectSort(int a[], int start, int end)

  13. {

  14. if (start < end)

  15. {

  16. int temp = a[start];

  17. int index = start;

  18. for (int i = start + 1; i < end; i++)

  19. {

  20. if (a[index] > a[i])

  21. {

  22. index = i;

  23. }

  24. }

  25. if (start != index)

  26. {

  27. temp = a[start];

  28. a[start] = a[index];

  29. a[index] = temp;

  30. }

  31. start++;

  32. RecursiveSelectSort(a, start, end);

  33. }

  34. }


 

 

 

2.堆排序
思想:一是建立堆,二是堆顶与堆的最后一个元素交换位置。所以堆排序有两个函数组成。一是建堆的渗透函数,

二是反复调用渗透函数实现排序的函数。

 

 
  1. void swap(int *a, int *b)

  2. {

  3. int tmp = *a;

  4. *a = *b;

  5. *b = tmp;

  6. }

  7.  
  8. void HeapAdjust(int *a, int i, int size) //调整堆

  9. {

  10. int lchild = 2 * i; //i的左孩子节点序号

  11. int rchild = 2 * i + 1; //i的右孩子节点序号

  12. int max = i; //临时变量

  13. if (i <= size / 2) //如果i不是叶节点就不用进行调整

  14. {

  15. if (lchild <= size&&a[lchild] > a[max])

  16. {

  17. max = lchild;

  18. }

  19. if (rchild <= size&&a[rchild] > a[max])

  20. {

  21. max = rchild;

  22. }

  23. if (max != i)

  24. {

  25. swap(a[i], a[max]);

  26. HeapAdjust(a, max, size); //避免调整之后以max为父节点的子树不是堆

  27. }

  28. }

  29. }

  30.  
  31. void BuildHeap(int *a, int size) //建立堆

  32. {

  33. int i;

  34. for (i = size / 2; i >= 1; i--) //非叶节点最大序号值为size/2

  35. {

  36. HeapAdjust(a, i, size);

  37. }

  38. }

  39.  
  40. void HeapSort(int *a, int size) //堆排序

  41. {

  42. int i;

  43. BuildHeap(a, size);

  44. for (i = size; i >= 1; i--)

  45. {

  46. swap(a[1], a[i]); //交换堆顶和最后一个元素,即每次将剩余元素中的最大者放到最后面

  47. HeapAdjust(a, 1, i - 1); //重新调整堆顶节点成为大顶堆

  48. }

  49. }


 

 

3.冒泡排序

思想:通过两两交换,像水中的泡泡一样,小的先冒出来,大的后冒出来,每一次都有一个相对的最大值沉底。

 

 
  1. void BubbleSort(int a[], int n)

  2. {

  3. int temp;

  4. for (int i = 0; i < n - 1; i++) //执行(n-1)次 每一次冒泡 都有一个最大值沉底

  5. {

  6. for (int j = 0; j< n - i - 1; j++) //执行(n-1)次 冒泡的次数 决定冒泡的位置

  7. {

  8. if (a[j]>a[j + 1])

  9. {

  10. temp = a[j];

  11. a[j] = a[j + 1];

  12. a[j + 1] = temp;

  13. }

  14. }

  15. }

  16. }

  17.  
  18. //改进的冒泡排序

  19. //最佳运行时间:O(n)

  20. //最坏运行时间:O(n^2)

  21. void BubbleSort2(int a[], int n)

  22. {

  23. int temp,flag = 0;

  24. for (int i = 0; i < n - 1; i++) //每一次冒泡 都有一个最大值沉底

  25. {

  26. for (int j = 0; j<n - i - 1; j++) //冒泡的次数 决定冒泡的位置

  27. {

  28. if (a[j]>a[j + 1])

  29. {

  30. flag = 1;

  31. temp = a[j];

  32. a[j] = a[j + 1];

  33. a[j + 1] = temp;

  34. }

  35. }

  36. if (flag == 0)

  37. break; //没有数据交换 已经排好序了

  38. }

  39. }

  40. //改进2传统冒泡排序中每一趟排序操作只能找到一个最大值或最小值,我们考虑利用在每趟排序中进行正向和反向两遍冒泡的方法一次

  41. //可以得到两个最终值(最大者和最小者) , 从而使排序趟数几乎减少了一半。

  42. void Bubble_2(int a[], int n)

  43. {

  44. int low = 0;

  45. int high = n - 1; //设置变量的初始值

  46. int tmp, j;

  47. while (low < high)

  48. {

  49. for (j = low; j< high; ++j) //正向冒泡,找到最大者

  50. if (a[j]> a[j + 1])

  51. {

  52. tmp = a[j];

  53. a[j] = a[j + 1];

  54. a[j + 1] = tmp;

  55. }

  56. --high; //修改high值, 前移一位

  57. for (j = high; j>low; --j) //反向冒泡,找到最小者

  58. if (a[j] < a[j - 1])

  59. {

  60. tmp = a[j];

  61. a[j] = a[j - 1];

  62. a[j - 1] = tmp;

  63. }

  64. ++low; //修改low值,后移一位

  65. }

  66. }

  67. //递归冒泡排序

  68. void RecursiveBubbleSort(int a[], int start, int end)

  69. {

  70. if (start < end) //循环结束条件一为start == end

  71. {

  72. int temp = 0;

  73. int length = end - start + 1;

  74. for (int i = start; i < length - 1; i++) //循环结束条件二为i < length - 1;

  75. {

  76. if (a[i] < a[i + 1])

  77. {

  78. temp = a[i];

  79. a[i] = a[i + 1];

  80. a[i + 1] = temp;

  81. }

  82. }

  83. end--;

  84. RecursiveBubbleSort(a, start, end);

  85. }

  86. }

 

4.快速排序
思想:选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的 元素值比基准值大。用同样的方法继续进行排序,直到整个序列有序。

 

 
  1. void Swap(int *p1, int *p2)

  2. {

  3. int temp = *p1;

  4. *p1 = *p2;

  5. *p2 = temp;

  6. }

  7. void QuickSort(int *arr, int ileft, int iright, int length)

  8. {

  9. int i = ileft;//从左边开始循环

  10. int j = iright + 1;//从右边开始循环

  11.  
  12. if (i < j)

  13. {

  14. do

  15. {

  16. do

  17. {

  18. i++;

  19. } while (arr[i] <= arr[ileft] && i <= iright);

  20. do

  21. {

  22. j--;

  23. } while (arr[j] >= arr[ileft] && j > ileft);

  24. if (i < j)

  25. {

  26. Swap(&arr[i], &arr[j]);

  27. }

  28. } while (i < j);

  29. Swap(&arr[ileft], &arr[j]);

  30. QuickSort(arr, ileft, j - 1, 0);

  31. QuickSort(arr, j + 1, iright, 0);

  32. }

  33. }

  34. //改进快排

  35. void Swap(int *p1, int *p2)

  36. {

  37. int temp = *p1;

  38. *p1 = *p2;

  39. *p2 = temp;

  40. }

  41.  
  42. int partition(int a[], int low, int high)

  43. {

  44. int privotKey = a[low]; //基准元素

  45. while (low < high){ //从表的两端交替地向中间扫描

  46. while (low < high && a[high] >= privotKey)

  47. --high; //从high 所指位置向前搜索,至多到low+1 位置。将比基准元素小的交换到低端

  48. Swap(&a[low], &a[high]);

  49. while (low < high && a[low] <= privotKey)

  50. ++low;

  51. Swap(&a[low], &a[high]);

  52. }

  53. return low;

  54. }

  55.  
  56.  
  57. void qsort_improve(int r[], int low, int high, int k)

  58. {

  59. if (high - low > k)

  60. { //长度大于k时递归, k为指定的数

  61. int pivot = partition(r, low, high); // 调用的Partition算法保持不变

  62. qsort_improve(r, low, pivot - 1, k);

  63. qsort_improve(r, pivot + 1, high, k);

  64. }

  65. }

  66. void quickSort(int r[], int n, int k)

  67. {

  68. qsort_improve(r, 0, n, k);//先调用改进算法Qsort使之基本有序

  69.  
  70. //再用插入排序对基本有序序列排序

  71. for (int i = 1; i <= n; i++){

  72. int tmp = r[i];

  73. int j = i - 1;

  74. while (tmp < r[j])

  75. {

  76. r[j + 1] = r[j];

  77. j = j - 1;

  78. }

  79. r[j + 1] = tmp;

  80. }

  81.  
  82. }


 

 

5.插入排序
思想:假设待排序的记录存放在数组R[1..n]中。初始时,R[1]自成1个有序区,无序区为R[2..n]。从i=2起直至i=n为止,依次将R[i]插入当前的有序区R[1..i-1]中,生成含n个记录的有序区。

 

 
  1. void InsertSort(int a[], int n)

  2. {

  3. for (int i = 2; i <=n; i++) //外循环(n-1)次

  4. {

  5. int j = i - 1; // 从下标为1开始

  6. a[0] = a[i]; //每个数都要与a[0](相当于key)比较

  7. while (a[0]<a[j] && j >0) //比a[0]大,则替换

  8. {

  9. a[j + 1] = a[j];

  10. j--; //向前移动一位,再进行比较

  11. }

  12. a[j + 1] = a[0];

  13. }

  14.  
  15. }

  16. int main()

  17. {

  18. int a[20], i, n =10;

  19. int num = 10;

  20. for (i = 1; i <=10; i++)

  21. a[i] = num--;

  22. cout << "原序列:\n";

  23. for (i = 1; i <=n; i++)

  24. cout << a[i] << " ";

  25. cout << endl;

  26.  
  27. InsertSort(a, 10);

  28.  
  29. cout << "排序后:\n";

  30. for (i = 1; i <=n; i++)

  31. cout << a[i] << " ";

  32. return 0;

  33. }


 

 

6.希尔排序
思想:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为d1的倍数的记录放///在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。

 

 
  1. void ShellSort(int a[], int n)

  2. {

  3. int d = n / 2;

  4. while (d >= 1)

  5. {

  6. for (int i = 2 + d; i <= n; i++)

  7. {

  8. int j = i - d;

  9. a[0] = a[i];

  10. while (j > 0 && a[0] < a[j])

  11. {

  12. a[j + d] = a[j];

  13. j = j - d;

  14. }

  15. a[j + d] = a[0];

  16. }

  17. d = d / 2;

  18. }

  19. }

  20. int main()

  21. {

  22. int a[20], i, n =10;

  23. int num = 10;

  24. for (i = 1; i <=10; i++)

  25. a[i] = num--;

  26. cout << "原序列:\n";

  27. for (i = 1; i <=n; i++)

  28. cout << a[i] << " ";

  29. cout << endl;

  30.  
  31. ShellSort(a, 10);

  32.  
  33. cout << "排序后:\n";

  34. for (i = 1; i <=n; i++)

  35. cout << a[i] << " ";

  36. return 0;

  37. }


 

 

7.归并排序法
思想:将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。

 

 
  1. //将r[i…m]和r[m +1 …n]归并到辅助数组b[i…n]

  2. void Merge(int *a, int *b, int i, int m, int n)

  3. {

  4. int j, k;

  5. for (j = m + 1, k = i; i <= m && j <= n; ++k)

  6. {

  7. if (a[j] < a[i])

  8. b[k] = a[j++];

  9. else

  10. b[k] = a[i++];

  11. }

  12. while (i <= m)

  13. b[k++] = a[i++];

  14. while (j <= n)

  15. b[k++] = a[j++];

  16. }

  17.  
  18. void MergeSort(int *a, int *b, int lenght)

  19. {

  20. int len = 1;

  21. int *q = a;

  22. int *tmp;

  23. while (len < lenght)

  24. {

  25. int s = len;

  26. len = 2 * s;

  27. int i = 0;

  28. while (i + len < lenght)

  29. {

  30. Merge(q, b, i, i + s - 1, i + len - 1); //对等长的两个子表合并

  31. i = i + len;

  32. }

  33. if (i + s < lenght)

  34. Merge(q, b, i, i + s - 1, lenght - 1); //对不等长的两个子表合并

  35.  
  36. tmp = q; q = b; b = tmp; //交换q,b,以保证下一趟归并时,仍从q 归并到b

  37. }

  38. }

  39. int main()

  40. {

  41. int a[10] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };

  42. int b[10];

  43. cout << "原序列:\n";

  44. for (int i = 0; i < 10; i++)

  45. cout << a[i] << " ";

  46. cout << endl;

  47. MergeSort(a, b, 10);

  48. cout << "排序后:\n";

  49. for (int i = 0; i < 10; i++)

  50. cout << a[i] << " ";

  51. return 0;

  52. }

  53. //两路归并

  54. //思想设两个有序的子文件(相当于输入堆)放在同一向量中相邻的位置上:R[low..m],R[m+1..high],先将它们合并到

  55. //一个局部的暂存向量R1(相当于输出堆)中,待合并完成后将R1复制回R[low..high]中。

  56. //merge two subArray,one is A[i1]~A[j1],another is A[i2]~A[j2]

  57. void MergeTwoArray(int A[], int i1, int j1, int i2, int j2)

  58. {

  59. int *tmp = new int[j2 - i1 + 1];

  60. int i = i1, j = i2, k = 0;

  61. while (i <= j1 && j <= j2)

  62. {

  63. //add samller one into tmp arrary

  64. if (A[i] <= A[j])

  65. {

  66. tmp[k++] = A[i++];

  67. }

  68. else

  69. {

  70. tmp[k++] = A[j++];

  71. }

  72. }

  73. while (i <= j1)

  74. tmp[k++] = A[i++];

  75. while (j <= j2)

  76. tmp[k++] = A[j++];

  77.  
  78.  
  79. for (i = 0; i < k; i++)

  80. {

  81. A[i1++] = tmp[i];

  82. }

  83. delete[]tmp;

  84.  
  85.  
  86. }

  87.  
  88.  
  89. void MergeSort(int A[], int n)

  90. {

  91. int i1, j1, i2, j2 = 0;

  92. int size = 1;

  93. while (size < n)

  94. {

  95. i1 = 0;

  96. while (i1 + size < n)//存在两个序列,那就需要合并

  97. {

  98. //确定两个序列的边界

  99. j1 = i1 + size - 1;

  100. i2 = i1 + size;

  101. if (i2 + size - 1 > n - 1)

  102. {

  103. j2 = n - 1;

  104. }

  105. else

  106. j2 = i2 + size - 1;

  107. MergeTwoArray(A, i1, j1, i2, j2);

  108. //更新i1

  109. i1 = j2 + 1;

  110. }

  111. size *= 2;

  112. }

  113. }

  114.  
  115. int main()

  116. {

  117. int a[10] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };

  118. cout << "原序列:\n";

  119. for (int i = 0; i < 10; i++)

  120. cout << a[i] << " ";

  121. cout << endl;

  122. MergeSort(a, 10);

  123. cout << "排序后:\n";

  124. for (int i = 0; i < 10; i++)

  125. cout << a[i] << " ";

  126. return 0;

  127. }


 

 

 

8.(桶)基数排序
思想:基数排序是通过“分配”和“收集”过程来实现排序。

 

 

[cpp] view plain copy

  1. <code class="language-cpp">int getdigit(int x, int d)  
  2. {  
  3.     int a[] = { 1, 1, 10 };     //因为待排数据最大数据也只是两位数,所以在此只需要到十位就满足  
  4.     return ((x / a[d]) % 10);    //确定桶号  
  5. }  
  6.   
  7. void msdradix_sort(int arr[], int begin, int end, int d)  
  8. {  
  9.     const int radix = 10;  
  10.     int count[radix], i, j;  
  11.     //置空  
  12.     for (i = 0; i < radix; ++i)  
  13.     {  
  14.         count[i] = 0;  
  15.     }  
  16.     //分配桶存储空间  
  17.     int *bucket = (int *)malloc((end - begin + 1) * sizeof(int));  
  18.     //统计各桶需要装的元素的个数    
  19.     for (i = begin; i <= end; ++i)  
  20.     {  
  21.         count[getdigit(arr[i], d)]++;  
  22.     }  
  23.     //求出桶的边界索引,count[i]值为第i个桶的右边界索引+1  
  24.     for (i = 1; i < radix; ++i)  
  25.     {  
  26.         count[i] = count[i] + count[i - 1];  
  27.     }  
  28.     //这里要从右向左扫描,保证排序稳定性   
  29.     for (i = end; i >= begin; --i)  
  30.     {  
  31.         j = getdigit(arr[i], d);      //求出关键码的第d位的数字, 例如:576的第3位是5     
  32.         bucket[count[j] - 1] = arr[i];   //放入对应的桶中,count[j]-1是第j个桶的右边界索引     
  33.         --count[j];                    //第j个桶放下一个元素的位置(右边界索引+1)     
  34.     }  
  35.     //注意:此时count[i]为第i个桶左边界      
  36.     //从各个桶中收集数据    
  37.     for (i = begin, j = 0; i <= end; ++i, ++j)  
  38.     {  
  39.         arr[i] = bucket[j];  
  40.     }  
  41.     //释放存储空间  
  42.     free(bucket);  
  43.     //对各桶中数据进行再排序  
  44.     for (i = 0; i < radix; i++)  
  45.     {  
  46.         int p1 = begin + count[i];         //第i个桶的左边界     
  47.         int p2 = begin + count[i + 1] - 1;     //第i个桶的右边界     
  48.         if (p1 < p2 && d > 1)  
  49.         {  
  50.             msdradix_sort(arr, p1, p2, d - 1);  //对第i个桶递归调用,进行基数排序,数位降 1      
  51.         }  
  52.     }  
  53. }  
  54. int main()  
  55. {  
  56.     int a[10] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };  
  57.     cout << "原序列:\n";  
  58.     for (int i = 0; i < 10; i++)  
  59.         cout << a[i] << "  ";  
  60.     cout << endl;  
  61.     msdradix_sort(a, 0, 10 - 1, 2);  
  62.     cout << "排序后:\n";  
  63.     for (int i = 0; i < 10; i++)  
  64.         cout << a[i] << "  ";  
  65.     return 0;  
  66. }</code>  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值