• 数据结构--7.2.1排序算法(冒泡、直接选择、直接插入)


    一、排序算法概念

            假设含有n个记录的序列为{r1,r2,……,rn},其相应的关键字分别为{K1,K2,……,Kn},需确定1,2,3,……,n的一种排序p1,p2,p3,……,pn;使其相应的关键字满足kp1<=kp2<=kp3<=kp4<=……<=kpn非递减(或非递增)关系,即使得序列称为一个按关键字有序得序列{rp1,rp2,……,rpn},这样的操作就成为排序。

    排序问题中,通常将数据元素称为记录。

    ——显然我们输入得是一个记录集合,排序后输出的也是一个记录的集合。

    ——所以我们可以将排序看成是线性表的一种操作。

    排序的依据是关键字之间的大小关系,那么对同一记录集合,针对不同的关键字进行排序,可以得到不同序列。

    排序的稳定性

    假设Ki = Kj(1<=i<=n,1<=j<=n,i != j),且在排序前的序列中ri领先于rj(即i

    ——如果排序后ri仍然领先于rj,则称所用的排序方法是稳定的;

    ——反之,若可能使得排序后的序列中rj领先ri,则称所用的排序方法是不稳定的。

    影响排序算法性能的几个要素

    ——时间性能

    ——辅助空间

    ——算法的复杂性 

    二、冒泡排序

    冒泡排序的基本思想:两两相邻记录的关键字,如果反序则交换,知道没有反序为止! 

    1. #include
    2. #define t 10
    3. void BobbleSort(int k[],int n)
    4. {
    5. int i,j,temp;
    6. for(i=0;i-1;i++)
    7. {
    8. for(j=i+1;j
    9. {
    10. if(k[i]>k[j])
    11. {
    12. temp = k[j];
    13. k[j] = k[i];
    14. k[i] = temp;
    15. }
    16. }
    17. }
    18. }
    19. int main()
    20. {
    21. int i,a[t] = {4,2,5,10,39,1,3,65,8,6};
    22. BobbleSort(a,t);
    23. printf("排序后的结果:\n");
    24. for(i=0;i
    25. {
    26. printf("%d\t",a[i]);
    27. }
    28. printf("\n\n");
    29. return 0;
    30. }

     冒泡排序的要点

    1、两两注意是相邻的两个元素的意思。

    2、如果有n个元素需要比较n-1次,每一轮减少1次比较。

    3、既然叫冒泡排序,那就是从下往上两两比较,所以看上去就跟泡泡往上冒一样。

    1. 冒泡排序最终版
    2. #include
    3. #define t 10
    4. int count1=0;
    5. int count2=0;
    6. void BobbleSort(int k[],int n)
    7. {
    8. int i,j,temp;
    9. int falg=1;
    10. for(i=0;i-1 && falg;i++)
    11. {
    12. for(j=n-1;j>i;j--)
    13. {
    14. count1++;
    15. falg=0;
    16. if(k[j-1]>k[j])
    17. {
    18. count2++;
    19. temp = k[j-1];
    20. k[j-1] = k[j];
    21. k[j] = temp;
    22. falg = 1;
    23. }
    24. }
    25. }
    26. }
    27. int main()
    28. {
    29. int i,a[t] = {4,2,5,10,39,1,3,65,99,8};
    30. BobbleSort(a,t);
    31. printf("总共进行了%d次比较,进行了%d次移动。",count1,count2);
    32. printf("排序后的结果:\n");
    33. for(i=0;i
    34. {
    35. printf("%d\t",a[i]);
    36. }
    37. printf("\n\n");
    38. return 0;
    39. }

     三、直接选择排序

    1. #include
    2. void SelectSort(int k[],int n)
    3. {
    4. int i,j,min,temp;
    5. for(i=0;i-1;i++)
    6. {
    7. min = i;
    8. for(j=i+1;j
    9. {
    10. if(k[j]
    11. {
    12. min = j;
    13. }
    14. }
    15. if(min != i)
    16. {
    17. temp = k[min];
    18. k[min] = k[i];
    19. k[i] = temp;
    20. }
    21. }
    22. }
    23. int main()
    24. {
    25. int i,a[10]= {5,2,6,0,3,9,1,7,4,8};
    26. SelectSort(a,10);
    27. printf("排序后的结果是:\n");
    28. for(i=0;i<10;i++)
    29. {
    30. printf("%d\t",a[i]);
    31. }
    32. printf("\n\n");
    33. return 0;
    34. }

     四、直接插入排序

            直接插入排序算法(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增加1的有序表。

    1. #include
    2. void InsertSort(int k[],int n)
    3. {
    4. int i,j,temp;
    5. for(i=1;i
    6. {
    7. if(k[i]-1])
    8. {
    9. temp = k[i];
    10. for(j=i-1;k[j]>temp;j--)
    11. {
    12. k[j+1] = k[j];
    13. }
    14. k[j+1] = temp;
    15. }
    16. }
    17. }
    18. int main()
    19. {
    20. int i,a[10]= {5,2,6,0,3,9,1,7,4,8};
    21. InsertSort(a,10);
    22. printf("排序后的结果是:\n");
    23. for(i=0;i<10;i++)
    24. {
    25. printf("%d\t",a[i]);
    26. }
    27. printf("\n\n");
    28. return 0;
    29. }

  • 相关阅读:
    力扣-58. 最后一个单词的长度
    北大图灵班学子斩获全球竞赛本科生第一名,攻关EDA“卡脖子”技术难题
    matlab读取文件
    JavaWeb Session会话
    Java线程池
    艾泊宇产品战略:华为手机品牌是如何从低端到高端的
    表名注解/主键注解/字段注解/乐观锁注解[MyBatis-Plus系列] - 第486篇
    Java面试题以及答案(三)多线程(必会)
    持续集成部署-k8s-命令行工具:基础命令的使用
    minio使用案例(Springboot)
  • 原文地址:https://blog.csdn.net/ww1425408527/article/details/132857910