当前位置:   article > 正文

排序算法总结--C++代码实现_c++快速输出每次顺序

c++快速输出每次顺序

1.常见排序算法

 

 

 

 

 

2. 插入排序

2.1 直接插入排序

  1. void print(int *arr, int nCount, int n=0)
  2. {
  3. int i = 0;
  4. printf("%d==== ", n);
  5. while(i < nCount) printf("%2d ", arr[i++]);
  6. printf("\n");
  7. }
  8. // Straight Insertion Sort
  9. void InsertSort(int* arr, int nCount)
  10. {
  11. if (arr == NULL || nCount < 2)
  12. {
  13. return;
  14. }
  15. for(int i = 1; i < nCount; i++)
  16. {
  17. if(arr[i] < arr[i-1])
  18. {
  19. int t= arr[i];
  20. int j = i;
  21. while((j > 0) && (t <= arr[j-1]))
  22. {
  23. arr[j] = arr[j-1];
  24. j--;
  25. }
  26. arr[j] = t;
  27. }
  28. }
  29. }

2.2 希尔排序 -- 插入

  1. void print(int *arr, int nCount, int n=0)
  2. {
  3. int i = 0;
  4. printf("%d==== ", n);
  5. while(i < nCount) printf("%2d ", arr[i++]);
  6. printf("\n");
  7. }
  8. // ShellInsertSort
  9. void ShellInsertSort(int* arr, int nCount)
  10. {
  11. if (arr == NULL || nCount < 2)
  12. {
  13. return;
  14. }
  15. int dk = nCount/2;
  16. while(dk > 0)
  17. {
  18. for(int i = dk; i < nCount; i++)
  19. {
  20. if (arr[i] < arr[i-dk])
  21. {
  22. int t = arr[i];
  23. int j = i;
  24. while(j-dk>=0 && arr[j-dk]>t)
  25. {
  26. arr[j] = arr[j-dk];
  27. j-=dk;
  28. }
  29. arr[j] = t;
  30. }
  31. print(arr,nCount,i);
  32. }
  33. print(arr,nCount,dk);
  34. dk = dk/2;
  35. }
  36. }

3. 选择排序

3.1直接选择排序

  1. #include<iostream>
  2. void print(int a[], int n ,int i){
  3. std::cout<<"第"<<i+1 <<"趟 : ";
  4. for(int j= 0; j<8; j++){
  5. std::cout<<a[j] <<" ";
  6. }
  7. std::cout<<std::endl;
  8. }
  9. /**
  10. * 数组的最小值
  11. *
  12. * @return int 数组的键值
  13. */
  14. int SelectMinKey(int a[], int n, int i)
  15. {
  16. int k = i;
  17. for(int j=i+1 ;j< n; ++j) {
  18. if(a[k] > a[j]) k = j;
  19. }
  20. return k;
  21. }
  22. /**
  23. * 选择排序
  24. *
  25. */
  26. void selectSort(int a[], int n){
  27. int key, tmp;
  28. for(int i = 0; i< n; ++i) {
  29. key = SelectMinKey(a, n,i); //选择最小的元素
  30. if(key != i){
  31. tmp = a[i]; a[i] = a[key]; a[key] = tmp; //最小元素与第i位置元素互换
  32. }
  33. print(a, n , i);
  34. }
  35. }
  36. /**
  37. * 优化
  38. */
  39. void SelectSort(int r[],int n) {
  40. int i ,j , min ,max, tmp;
  41. for (i=1 ;i <= n/2;i++) {
  42. // 做不超过n/2趟选择排序
  43. min = i; max = i ; //分别记录最大和最小关键字记录位置
  44. for (j= i+1; j<= n-i; j++) {
  45. if (r[j] > r[max]) {
  46. max = j ; continue ;
  47. }
  48. if (r[j]< r[min]) {
  49. min = j ;
  50. }
  51. }
  52. //该交换操作还可分情况讨论以提高效率
  53. tmp = r[i-1]; r[i-1] = r[min]; r[min] = tmp;
  54. tmp = r[n-i]; r[n-i] = r[max]; r[max] = tmp;
  55. }
  56. }
  57. int main(){
  58. int a[8] = {3,1,5,7,2,4,9,6};
  59. std::cout<<"初始值:";
  60. for(int j= 0; j<8; j++){
  61. std::cout<<a[j] <<" ";
  62. }
  63. std::cout<<std::endl<<std::endl;
  64. selectSort(a, 8);
  65. print(a,8,8);
  66. }

3.2堆排序--选择 

  1. #include<iostream>
  2. using namespace std;
  3. void print(int a[], int n){
  4. for(int j= 0; j<n; j++){
  5. cout<<a[j] <<" ";
  6. }
  7. cout<<endl;
  8. }
  9. /**
  10. * 已知H[s…m]除了H[s] 外均满足堆的定义
  11. * 调整H[s],使其成为大顶堆.即将对第s个结点为根的子树筛选,
  12. *
  13. * @param H是待调整的堆数组
  14. * @param s是待调整的数组元素的位置
  15. * @param length是数组的长度
  16. *
  17. */
  18. void HeapAdjust(int H[],int s, int length)
  19. {
  20. int tmp = H[s];
  21. int child = 2*s+1; //左孩子结点的位置。(i+1 为当前调整结点的右孩子结点的位置)
  22. while (child < length) {
  23. if(child+1 <length && H[child]<H[child+1]) { // 如果右孩子大于左孩子(找到比当前待调整结点大的孩子结点)
  24. ++child ;
  25. }
  26. if(H[s]<H[child]) { // 如果较大的子结点大于父结点
  27. H[s] = H[child]; // 那么把较大的子结点往上移动,替换它的父结点
  28. s = child; // 重新设置s ,即待调整的下一个结点的位置
  29. child = 2*s+1;
  30. } else { // 如果当前待调整结点大于它的左右孩子,则不需要调整,直接退出
  31. break;
  32. }
  33. H[s] = tmp; // 当前待调整的结点放到比其大的孩子结点位置上
  34. }
  35. print(H,length);
  36. }
  37. /**
  38. * 初始堆进行调整
  39. * 将H[0..length-1]建成堆
  40. * 调整完之后第一个元素是序列的最小的元素
  41. */
  42. void BuildingHeap(int H[], int length)
  43. {
  44. //最后一个有孩子的节点的位置 i= (length -1) / 2
  45. for (int i = (length -1) / 2 ; i >= 0; --i)
  46. HeapAdjust(H,i,length);
  47. }
  48. /**
  49. * 堆排序算法
  50. */
  51. void HeapSort(int H[],int length)
  52. {
  53. //初始堆
  54. BuildingHeap(H, length);
  55. //从最后一个元素开始对序列进行调整
  56. for (int i = length - 1; i > 0; --i)
  57. {
  58. //交换堆顶元素H[0]和堆中最后一个元素
  59. int temp = H[i]; H[i] = H[0]; H[0] = temp;
  60. //每次交换堆顶元素和堆中最后一个元素之后,都要对堆进行调整
  61. HeapAdjust(H,0,i);
  62. }
  63. }
  64. int main(){
  65. int H[10] = {3,1,5,7,2,4,9,6,10,8};
  66. cout<<"初始值:";
  67. print(H,10);
  68. HeapSort(H,10);
  69. //selectSort(a, 8);
  70. cout<<"结果:";
  71. print(H,10);
  72. }

4. 交换排序

4.1 冒泡排序

  1. void print(int *arr, int nCount, int n=0)
  2. {
  3. int i = 0;
  4. printf("%d==== ", n);
  5. while(i < nCount) printf("%2d ", arr[i++]);
  6. printf("\n");
  7. }
  8. void BubbleSort(int *arr, int nCount)
  9. {
  10. for(int i = 0; i < nCount; i++)
  11. {
  12. for(int j = 1; j < nCount-i; j++)
  13. {
  14. if (arr[j-1] > arr[j])
  15. {
  16. arr[j-1] += arr[j];
  17. arr[j] = arr[j-1] - arr[j];
  18. arr[j-1] = arr[j-1] - arr[j];
  19. }
  20. }
  21. print(arr, 10, i);
  22. }
  23. }

4.2 快速排序

  1. #include<iostream>
  2. using namespace std;
  3. void print(int a[], int n){
  4. for(int j= 0; j<n; j++){
  5. cout<<a[j] <<" ";
  6. }
  7. cout<<endl;
  8. }
  9. void swap(int *a, int *b)
  10. {
  11. int tmp = *a;
  12. *a = *b;
  13. *b = tmp;
  14. }
  15. int partition(int a[], int low, int high)
  16. {
  17. int privotKey = a[low]; //基准元素
  18. while(low < high){ //从表的两端交替地向中间扫描
  19. while(low < high && a[high] >= privotKey) --high; //从high 所指位置向前搜索,至多到low+1 位置。将比基准元素小的交换到低端
  20. swap(&a[low], &a[high]);
  21. while(low < high && a[low] <= privotKey ) ++low;
  22. swap(&a[low], &a[high]);
  23. }
  24. print(a,10);
  25. return low;
  26. }
  27. void quickSort(int a[], int low, int high){
  28. if(low < high){
  29. int privotLoc = partition(a, low, high); //将表一分为二
  30. quickSort(a, low, privotLoc -1); //递归对低子表递归排序
  31. quickSort(a, privotLoc + 1, high); //递归对高子表递归排序
  32. }
  33. }
  34. int main(){
  35. int a[10] = {3,1,5,7,2,4,9,6,10,8};
  36. cout<<"初始值:";
  37. print(a,10);
  38. quickSort(a,0,9);
  39. cout<<"结果:";
  40. print(a,10);
  41. }

优化快速排序

  1. #include<iostream>
  2. using namespace std;
  3. void print(int a[], int n){
  4. for(int j= 0; j<n; j++){
  5. cout<<a[j] <<" ";
  6. }
  7. cout<<endl;
  8. }
  9. void swap(int *a, int *b)
  10. {
  11. int tmp = *a;
  12. *a = *b;
  13. *b = tmp;
  14. }
  15. int partition(int a[], int low, int high)
  16. {
  17. int privotKey = a[low]; //基准元素
  18. while(low < high){ //从表的两端交替地向中间扫描
  19. while(low < high && a[high] >= privotKey) --high; //从high 所指位置向前搜索,至多到low+1 位置。将比基准元素小的交换到低端
  20. swap(&a[low], &a[high]);
  21. while(low < high && a[low] <= privotKey ) ++low;
  22. swap(&a[low], &a[high]);
  23. }
  24. print(a,10);
  25. return low;
  26. }
  27. void qsort_improve(int r[ ],int low,int high, int k){
  28. if( high -low > k ) { //长度大于k时递归, k为指定的数
  29. int pivot = partition(r, low, high); // 调用的Partition算法保持不变
  30. qsort_improve(r, low, pivot - 1,k);
  31. qsort_improve(r, pivot + 1, high,k);
  32. }
  33. }
  34. void quickSort(int r[], int n, int k){
  35. qsort_improve(r,0,n,k);//先调用改进算法Qsort使之基本有序
  36. //再用插入排序对基本有序序列排序
  37. for(int i=1; i<=n;i ++){
  38. int tmp = r[i];
  39. int j=i-1;
  40. while(tmp < r[j]){
  41. r[j+1]=r[j]; j=j-1;
  42. }
  43. r[j+1] = tmp;
  44. }
  45. }
  46. int main(){
  47. int a[10] = {3,1,5,7,2,4,9,6,10,8};
  48. cout<<"初始值:";
  49. print(a,10);
  50. quickSort(a,9,4);
  51. cout<<"结果:";
  52. print(a,10);
  53. }

5. 归并排序

归并的合并方法:

  1. //将r[i…m]和r[m +1 …n]归并到辅助数组rf[i…n]
  2. void Merge(ElemType *r,ElemType *rf, int i, int m, int n)
  3. {
  4. int j,k;
  5. for(j=m+1,k=i; i<=m && j <=n ; ++k){
  6. if(r[j] < r[i]) rf[k] = r[j++];
  7. else rf[k] = r[i++];
  8. }
  9. while(i <= m) rf[k++] = r[i++];
  10. while(j <= n) rf[k++] = r[j++];
  11. }

归并的迭代算法

  1. #include<iostream>
  2. using namespace std;
  3. void print(int a[], int n){
  4. for(int j= 0; j<n; j++){
  5. cout<<a[j] <<" ";
  6. }
  7. cout<<endl;
  8. }
  9. //将r[i…m]和r[m +1 …n]归并到辅助数组rf[i…n]
  10. void Merge(ElemType *r,ElemType *rf, int i, int m, int n)
  11. {
  12. int j,k;
  13. for(j=m+1,k=i; i<=m && j <=n ; ++k){
  14. if(r[j] < r[i]) rf[k] = r[j++];
  15. else rf[k] = r[i++];
  16. }
  17. while(i <= m) rf[k++] = r[i++];
  18. while(j <= n) rf[k++] = r[j++];
  19. print(rf,n+1);
  20. }
  21. void MergeSort(ElemType *r, ElemType *rf, int lenght)
  22. {
  23. int len = 1;
  24. ElemType *q = r ;
  25. ElemType *tmp ;
  26. while(len < lenght) {
  27. int s = len;
  28. len = 2 * s ;
  29. int i = 0;
  30. while(i+ len <lenght){
  31. Merge(q, rf, i, i+ s-1, i+ len-1 ); //对等长的两个子表合并
  32. i = i+ len;
  33. }
  34. if(i + s < lenght){
  35. Merge(q, rf, i, i+ s -1, lenght -1); //对不等长的两个子表合并
  36. }
  37. tmp = q; q = rf; rf = tmp; //交换q,rf,以保证下一趟归并时,仍从q 归并到rf
  38. }
  39. }
  40. int main(){
  41. int a[10] = {3,1,5,7,2,4,9,6,10,8};
  42. int b[10];
  43. MergeSort(a, b, 10);
  44. print(b,10);
  45. cout<<"结果:";
  46. print(a,10);
  47. }

 

两路归并的递归算法

  1. void MSort(ElemType *r, ElemType *rf,int s, int t)
  2. {
  3. ElemType *rf2;
  4. if(s==t) r[s] = rf[s];
  5. else
  6. {
  7. int m=(s+t)/2; /*平分*p 表*/
  8. MSort(r, rf2, s, m); /*递归地将p[s…m]归并为有序的p2[s…m]*/
  9. MSort(r, rf2, m+1, t); /*递归地将p[m+1…t]归并为有序的p2[m+1…t]*/
  10. Merge(rf2, rf, s, m+1,t); /*将p2[s…m]和p2[m+1…t]归并到p1[s…t]*/
  11. }
  12. }
  13. void MergeSort_recursive(ElemType *r, ElemType *rf, int n)
  14. { /*对顺序表*p 作归并排序*/
  15. MSort(r, rf,0, n-1);
  16. }

6. 基数排序

  1. Void RadixSort(Node L[],length,maxradix)
  2. {
  3. int m,n,k,lsp;
  4. k=1;m=1;
  5. int temp[10][length-1];
  6. Empty(temp); //清空临时空间
  7. while(k<maxradix) //遍历所有关键字
  8. {
  9. for(int i=0;i<length;i++) //分配过程
  10. {
  11. if(L[i]<m)
  12. Temp[0][n]=L[i];
  13. else
  14. Lsp=(L[i]/m)%10; //确定关键字
  15. Temp[lsp][n]=L[i];
  16. n++;
  17. }
  18. CollectElement(L,Temp); //收集
  19. n=0;
  20. m=m*10;
  21. k++;
  22. }
  23. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/764231
推荐阅读
相关标签
  

闽ICP备14008679号