当前位置:   article > 正文

数据结构与算法中的排序算法_t=a[i] a[i]=a[6-i] a[6-i]=t

t=a[i] a[i]=a[6-i] a[6-i]=t

目录

一.直接插入排序

二.希尔排序

三.简单选择排序

四.堆排序

五.冒泡排序

六.快速排序

七.归并排序

八.基数排序

九.算法的稳定性和复杂度


一.直接插入排序

  1. #include <stdio.h>
  2. void Insertsort(int a[],int n){
  3. int i,j,t;
  4. for(i=1;i<n;i++){
  5. if(a[i]<a[i-1]){
  6. t=a[i];
  7. j=i-1;
  8. do{
  9. a[j+1]=a[j];
  10. j--;
  11. }while(j>=0 && a[j]>t);
  12. }
  13. a[j+1]=t;
  14. }
  15. }
  16. int main()
  17. {
  18. int a[9];
  19. int n;
  20. printf("请输入n个数:\nn=");
  21. scanf("%d",&n);
  22. printf("请输入:");
  23. for(int i=0;i<n;i++)
  24. scanf("%d",&a[i]);
  25. Insertsort(a,n);
  26. printf("排序后的数字顺序为:");
  27. for(int i=0;i<n;i++)
  28. printf("%d,",a[i]);
  29. return 0;
  30. }

二.希尔排序

  1. #include <stdio.h>
  2. void Shellsort(int a[],int n){
  3. int i,j,d,t;
  4. d=n/2;
  5. while(d>0){
  6. for(i=d;i<n;i++){
  7. t=a[i];
  8. j=i-d;
  9. while(j>=0 && t<a[j]){
  10. a[j+d]=a[j];
  11. j=j-d;
  12. }
  13. a[j+d]=t;
  14. }
  15. d=d/2;
  16. }
  17. }
  18. int main()
  19. {
  20. int a[9];
  21. int n;
  22. printf("请输入n个数:\nn=");
  23. scanf("%d",&n);
  24. printf("请输入:");
  25. for(int i=0;i<n;i++)
  26. scanf("%d",&a[i]);
  27. Shellsort(a,n);
  28. printf("排序后的数字顺序为:");
  29. for(int i=0;i<n;i++)
  30. printf("%d,",a[i]);
  31. return 0;
  32. }

三.简单选择排序

  1. #include <stdio.h>
  2. void SelectSort(int a[],int n)
  3. {
  4. int t,k;
  5. for(int i=0;i<n-1;i++)
  6. {
  7. k=i;
  8. for(int j=i;j<n;j++)
  9. {
  10. if(a[j]<a[k])
  11. {
  12. k=j;//记录最小值的下标
  13. }
  14. }
  15. if(k!=i)
  16. {
  17. t=a[k];
  18. a[k]=a[i];
  19. a[i]=t;
  20. }
  21. }
  22. }
  23. int main()
  24. {
  25. int n=5;
  26. int a[n];
  27. printf("请输入%d个数:",n);
  28. for(int i=0;i<n;i++)
  29. scanf("%d",&a[i]);
  30. SelectSort(a,n);
  31. printf("排序后的顺序为:");
  32. for(int i=0;i<n;i++)
  33. printf("%d,",a[i]);
  34. return 0;
  35. }

四.堆排序

  1. #include <stdio.h>
  2. void sift(int a[],int low,int high)
  3. {
  4. int i=low,j=2*i;
  5. int t=a[i];
  6. while(j<=high)
  7. {
  8. if(j<high && a[j]<a[j+1])
  9. j++;
  10. if(t<a[j])
  11. {
  12. a[i]=a[j];
  13. i=j;
  14. j=2*i;
  15. }
  16. else
  17. break;
  18. }
  19. a[i]=t;
  20. }
  21. void HeapSort(int a[],int n)
  22. {
  23. int i,t;
  24. for(i=n/2;i>=1;i--)
  25. sift(a,i,n);
  26. for(i=n;i>=2;i--)
  27. {
  28. t=a[1];
  29. a[1]=a[i];
  30. a[i]=t;
  31. //swap(a,0,i);
  32. sift(a,1,i-1);
  33. }
  34. }
  35. int main(){
  36. int a[]={6,8,7,9,0,1,3,2,4,5};
  37. int n = sizeof(a) / sizeof(a[0]);
  38. printf("%d\n",n);
  39. HeapSort(a,n);
  40. printf("排序好的数值顺序为:");
  41. for(int i=0;i<n;i++)
  42. printf("%d,",a[i]);
  43. return 0;
  44. }

五.冒泡排序

  1. #include <stdio.h>
  2. void MaopaoSort(int a[],int n)
  3. {
  4. int t;
  5. for(int i=0;i<n-1;i++) //4个数比较3次,n个数执行n-1次
  6. {
  7. for(int j=0;j<n-1-i;j++)
  8. //第n次比较中要比上一次少比较1次
  9. //如序列 3 2 4 1
  10. //第一次 4_1 2_1 3_1 交换位置,比较3次
  11. //第二次 4_2 3_4 交换位置,比较2次
  12. //第三次 3_4 交换位置,比较1次
  13. {
  14. if(a[j]>a[j+1])
  15. {
  16. t=a[j];
  17. a[j]=a[j+1];
  18. a[j+1]=t;
  19. }
  20. }
  21. }
  22. }
  23. int main()
  24. {
  25. int a[]={4,53,2,135,21,13,315,124};
  26. int n=sizeof(a)/sizeof(a[0]);
  27. MaopaoSort(a,n);
  28. for(int i=0;i<n;i++)
  29. printf("%d,",a[i]);
  30. return 0;
  31. }

六.快速排序

  1. #include <stdio.h>
  2. int partition(int a[],int s,int t)
  3. {
  4. int i=s,j=t;
  5. int tmp=a[i];
  6. while(i<j)//从两端交替向中间扫描,直至i=j为止
  7. {
  8. while(j>i && a[j]>=tmp)//从右向左扫描,找到一个小于tmp的值
  9. j--;
  10. a[i]=a[j];//找到这样的a[j]放到a[i]处
  11. while(i<j && a[i]<=tmp)
  12. i++;
  13. a[j]=a[i];
  14. }
  15. a[i]=tmp;
  16. return i;
  17. }
  18. void quickSort(int a[],int s,int t)
  19. {
  20. int i;
  21. if(s<t)//区间至少存在两个元素的情况
  22. {
  23. i=partition(a,s,t);
  24. quickSort(a,s,i-1);//对左区间递归排序
  25. quickSort(a,i+1,t);//对右区间递归排序
  26. }
  27. }
  28. int main()
  29. {
  30. int a[]={54,4671,134,124,315};
  31. int n=sizeof(a)/sizeof(a[0]);
  32. quickSort(a,0,n-1);//对a[0,n-1]的元素进行快速排序
  33. for(int i=0;i<n;i++)
  34. printf("%d,",a[i]);
  35. return 0;
  36. }

七.归并排序

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void Merge(int a[],int low,int mid,int high)//归并R[low..high]
  4. {
  5. int *R1;
  6. int i=low,j=mid+1,k=0;//k是R1的下标,i,j分别是第1、2段的下标
  7. R1=(int *)malloc((high-low+1)*sizeof(int));
  8. while(i<=mid && j<=high)//在第1段和第2段均未扫描完时循环
  9. {
  10. if(a[i]<=a[j])//将第1段中的元素放入R1中
  11. {
  12. R1[k]=a[i];
  13. i++;
  14. k++;
  15. }
  16. else//将第2段中的元素放入R1中
  17. {
  18. R1[k]=a[j];
  19. j++;k++;
  20. }
  21. }
  22. while(i<=mid)//将第1段余下的部分复制到R1
  23. {
  24. R1[k]=a[i];
  25. i++;k++;
  26. }
  27. while(j<=high)//将第2段余下的部分复制到R1
  28. {
  29. R1[k]=a[j];
  30. j++;
  31. k++;
  32. }
  33. for(k=0,i=low;i<=high;k++,i++)将R1复制到R[low..high]中
  34. a[i]=R1[k];
  35. free(R1);
  36. }
  37. void MergePass(int a[],int length,int n)//对整个排序序列进行一趟归并
  38. {
  39. int i;
  40. for(i=0;i+2*length-1<n;i=i+2*length)//归并length长的两相邻子表
  41. Merge(a,i,i+length-1,i+2*length-1);
  42. if(i+length-1<n-1)//余下两个子表,后者的长度小于length
  43. Merge(a,i,i+length-1,n-1);//归并这两个子表
  44. }
  45. void MergeSort(int a[],int n)//二路归并排序
  46. {
  47. int length;
  48. for(length=1;length<n;length=2*length)//进行log2n(向上取整)趟归并
  49. MergePass(a,length,n);
  50. }
  51. int main()
  52. {
  53. int a[]={14,673,25,1314,525,1,2,3,4,7};
  54. int n=sizeof(a)/sizeof(a[0]);
  55. MergeSort(a,n);
  56. for(int i=0;i<n;i++)
  57. printf("%d,",a[i]);
  58. return 0;
  59. }

八.基数排序

  1. #include <stdio.h>
  2. #include <string.h>
  3. #define size 10 // 数组长度
  4. #define D 5 // 最大位数
  5. //取整数M的第i位数
  6. int GetDigit(int M, int i)
  7. {
  8. while(i > 1)
  9. {
  10. M /= 10;
  11. i--;
  12. }
  13. return M % 10;
  14. }
  15. // 基数排序
  16. void RadixSort(int *num, int len)
  17. {
  18. int i, j, k, l, digit;
  19. int allot[10][size]; // 分配数组
  20. // 初始化分配数组全为0
  21. memset(allot, 0, sizeof(allot));
  22. // 遍历
  23. for (i = 1; i <= D; i++)
  24. {
  25. // 将每个数据的第i位数分配到allot数组中
  26. for (j = 0; j < len; j++)
  27. {
  28. // 获取当前数据 num[j] 的 第i位数
  29. digit = GetDigit(num[j], i);
  30. k = 0;
  31. // 查找插入的位置
  32. while (allot[digit][k])
  33. {
  34. k++;
  35. }
  36. // 将num[j]添加到分配数组allot的第digit行的末尾
  37. allot[digit][k] = num[j];
  38. }
  39. // 将分配数组的数据收集到原数组中
  40. l = 0;
  41. for (j = 0; j < 10; j++)
  42. {
  43. k = 0;
  44. // 获取数组allot的每一行的数据 到 原数组中
  45. while (allot[j][k])
  46. {
  47. num[l++] = allot[j][k++];
  48. }
  49. }
  50. memset(allot, 0, sizeof(allot));
  51. }
  52. }
  53. int main()
  54. {
  55. int i, num[size] = {52, 200, 4, 1034, 17, 3319, 8324, 33112, 603, 8};
  56. RadixSort(num, size);
  57. for (i = 0; i < size; i++)
  58. {
  59. printf("%d ", num[i]);
  60. }
  61. printf("\n");
  62. return 0;
  63. }

九.算法的稳定性和复杂度

 

 

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

闽ICP备14008679号