• 简单选择排序(c语言代码实现)


    目录

      

    选择排序:简单选择排序(不稳定的排序)

    下面我们来看一下顺序存储的代码如何实现

    还可以用链式存储的方法实现简单选择排序

    其实每一趟排序都可以确定一个元素的最终位置,这样经过n-1次就可以使整个排序表有序


      选择排序:简单选择排序(不稳定的排序)

    简单选择排序是一种基础的排序算法,它的基本思路是在未排序的序列中选择最小(或最大)的元素,将其与序列的第一个元素进行交换,然后在剩余的未排序序列中继续使用同样的方式进行选择和交换,直到整个序列排序完成。

    以下是简单选择排序的实现过程:

    1. 从序列中选择最小的元素,将其与序列的第一个元素进行交换;

    2. 在剩下的未排序序列中继续进行选择,找到最小的元素,将其与序列的第二个元素进行交换;

    3. 依此类推,直到整个序列排序完成

    时间复杂度:O(n^2) 。

    空间复杂度:O(1) 。

    下面我们来看一下顺序存储的代码如何实现

    1. void selectsort(int a[],int sz)
    2. {
    3. int i = 0;
    4. int j = 0;
    5. int min = 0;
    6. int temp = 0;
    7. for (i = 1; i < sz - 1; i++)//进行sz-1
    8. {
    9. min = i;//记录最小元素下标
    10. for (j = i + 1; j < sz; j++)//在i到sz-1中选择最小元素
    11. {
    12. if (a[j] < a[min])//更新最小元素的位置
    13. min = j;
    14. }
    15. if (min != i)
    16. {
    17. temp = a[min];
    18. a[min] = a[i];
    19. a[i] = temp;
    20. }
    21. }
    22. }

    完整测试代码

    1. #include<stdio.h>
    2. void selectsort(int a[],int sz)
    3. {
    4. int i = 0;
    5. int j = 0;
    6. int min = 0;
    7. int temp = 0;
    8. for (i = 1; i < sz - 1; i++)//进行sz-1
    9. {
    10. min = i;//记录最小元素下标
    11. for (j = i + 1; j < sz; j++)//在i到sz-1中选择最小元素
    12. {
    13. if (a[j] < a[min])//更新最小元素的位置
    14. min = j;
    15. }
    16. if (min != i)
    17. {
    18. temp = a[min];
    19. a[min] = a[i];
    20. a[i] = temp;
    21. }
    22. }
    23. }
    24. int main()
    25. {
    26. int a[] = { 0,49,38,65,97,76,13,27 };
    27. int sz = sizeof(a) / sizeof(a[0]);
    28. int j = 0;
    29. printf("原始待排序的数组为:");
    30. for(j = 1; j < sz; j++)
    31. printf("%d ", a[j]);
    32. selectsort(a,sz);
    33. printf("\n简单排序后的数组为:");
    34. for (j = 1; j < sz; j++)
    35. printf("%d ", a[j]);
    36. return 0;
    37. }

     

    还可以用链式存储的方法实现简单选择排序

    让我们来看一下代码该如何实现

    1. void selectsort(linklist* L)
    2. {
    3. lnode* p = (*L)->next, * pre = *L;
    4. lnode* minp = p, * minpre = pre;
    5. lnode* r = p;
    6. (*L)->next = NULL;
    7. lnode* s = *L;
    8. while (r)
    9. {
    10. minp = p = r;
    11. minpre = pre = NULL;
    12. while (p)
    13. {
    14. if (p->data < minp->data)
    15. {
    16. minp = p;
    17. minpre = pre;
    18. }
    19. pre = p;
    20. p = p->next;
    21. }
    22. if (minp == r)
    23. r = r->next;
    24. else
    25. minpre->next = minp->next;
    26. s->next = minp;
    27. s = minp;
    28. }
    29. }

    完整测试代码为

    1. #include<stdio.h>
    2. #include<stdlib.h>
    3. typedef struct lnode
    4. {
    5. int data;
    6. struct lnode* next;
    7. }lnode,*linklist;
    8. int a[10] = { 2,4,5,3,1,6,9,8,7,10 };
    9. int n = 10;
    10. void buildlinklist(linklist* L)
    11. {
    12. * L = (lnode*)malloc(sizeof(lnode));
    13. (*L)->next = NULL;
    14. lnode* s, * r = *L;
    15. int i = 0;
    16. for (i = 0; i < n; i++)
    17. {
    18. s = (lnode*)malloc(sizeof(lnode));
    19. s->data = a[i];
    20. s->next = r->next;
    21. r->next = s;
    22. r = s;
    23. }
    24. r->next = NULL;
    25. }
    26. void print(linklist* L)
    27. {
    28. lnode* k = (*L)->next;
    29. while (k)
    30. {
    31. printf("%d ", k->data);
    32. k = k->next;
    33. }
    34. }
    35. void selectsort(linklist* L)
    36. {
    37. lnode* p = (*L)->next, * pre = *L;
    38. lnode* minp = p, * minpre = pre;
    39. lnode* r = p;
    40. (*L)->next = NULL;
    41. lnode* s = *L;
    42. while (r)
    43. {
    44. minp = p = r;
    45. minpre = pre = NULL;
    46. while (p)
    47. {
    48. if (p->data < minp->data)
    49. {
    50. minp = p;
    51. minpre = pre;
    52. }
    53. pre = p;
    54. p = p->next;
    55. }
    56. if (minp == r)
    57. r = r->next;
    58. else
    59. minpre->next = minp->next;
    60. s->next = minp;
    61. s = minp;
    62. }
    63. }
    64. int main()
    65. {
    66. linklist L;
    67. buildlinklist(&L);
    68. selectsort(&L);
    69. print(&L);
    70. return 0;
    71. }

    实验结果为

    这里看是十次才完成简单选择排序

    其实每一趟排序都可以确定一个元素的最终位置,这样经过n-1次就可以使整个排序表有序

  • 相关阅读:
    Python实现WOA智能鲸鱼优化算法优化随机森林回归模型(RandomForestRegressor算法)项目实战
    单个Dockerfile合并多个镜像以及docker-compose批量部署
    k8s集群中部署项目之数据库准备
    Optional——优雅判空
    2022学习进阶之路:高并发+性能优化+Spring boot等大型项目实战
    Java通过报表技术POI&EasyPOI实现数据可视化
    Windows 下Tomcat监测重启
    什么蓝牙耳机听歌好?听歌音质好的蓝牙耳机推荐
    项目上线后我是如何通过慢查询和索引让系统快起来的
    过拟合、欠拟合、泛化误差、训练误差
  • 原文地址:https://blog.csdn.net/m0_46702681/article/details/134427265