当前位置:   article > 正文

c语言实现冒泡排序,选择排序,插入排序,三种基础排序算法

c语言实现冒泡排序,选择排序,插入排序,三种基础排序算法

1,冒泡排序

冒泡排序是最基础的算法,他是怎么实现的呢,

看这一排数据,我们要让他完成升序,也就是让87631变成13678

冒泡排序是一步一步往下走的先是第一次排序,8,跟后面的4个数排序,

8<7 交换,变成7 8 6 3 1;从8开始比

6<8 交换,变成7 6 8 3 1;还是从8开始

3<8 交换,变成7 6 3 8 1;从8开始

1<8 交换,变成7 6 3 1 8;这样就完成了第一次排序我们的8成功走到了最后

第二次排序

7<6 交换,变成6 7 3 1 8;从7开始

3<7 交换,变成6 3 7 1 8;从7开始

1<7 交换,变成6 3 1 7 8;从7开始

8>7 不交换,不变 6 3 1 7 8,看这样我们就完成了后面两数的排序

我们重复循环这个步骤,最后只剩到了开始从1进行这个过程的时候我们发现已经完成了排序,

所以我们一共需要4次大排序,也就是n-1次排序,n为所要进行排序的有效个数,那么每次进行的小排序要进行多少次呢,8的时候我们进行了4次,也就是8和7,6,3,1都进行了一次比较,我们记下来这个4,到7的时候我们只进行了3次交换,4四次其实是无效的因为我们第一次已经把最大的数字放到了最后,那可能大家有疑问那么,8,9,3,6,1的话那怎么办,一样的

8<9, 不交换, 8 9 3 6 1;

9>3, 交换, 8 3 9 6 1;

9>6, 交换, 8 3 6 9 1;

9>1,交换, 8 3 6 1 9;

这不我们还是把最后一个数放到了对应的位置,所以我们就不用管他了,每次不用管一个,所以每次小排序的次数就是n-i-1;i为0,递增;

  现在我们进行代码实现

  1. #include <stdio.h>
  2. void bubble(int arr[10],int n)
  3. {
  4. }
  5. int main()
  6. {
  7. int n;
  8. int arr[10];
  9. scanf("%d", &n);
  10. for( i=0; i<n; i++)
  11. {
  12. scanf("%d", &arr[i]);
  13. }
  14. bubble(arr,n);
  15. return 0;
  16. }

我们创建一个bubble函数专门实现冒泡排序

  1. void bubble(int arr[10],int n)
  2. {
  3. int i, j, k, tmp;
  4. for (i = 0; i < n; i++)
  5. {
  6. for (j = 0; j < n - i - 1; j++)
  7. {
  8. if (arr[j] > arr[j + 1])
  9. {
  10. tmp = arr[j];
  11. arr[j] = arr[j + 1];
  12. arr[j + 1] = tmp;
  13. }
  14. }
  15. }
  16. }

最后进行打印数组

2,选择排序

选择排序的思路是遍历数组,每次那一个最小的数放到前面直到有序

我们依旧用这一列数字来举例;

这个整体的大排序是多少次呢,我们来一步一步分析

第一次我们找到最小的1,把1放到最前面,得到1 8 7 6 3

第二次我们找到除了1以为最小的3,把3放到1后面,得到 1 3 8 7 6

第三次我们找到最小的6,把6放到3后面,得到 1 3 6 8 7

第四次我们找到最小的7,把7放到6后面,得到 1 3 6 7 8

完成升序,我们依旧是n-1次大排序,因为最后一个数在最后一次已经有序了;

那么每次大排序里面的小排序呢,

第一次 我们把8当成min,下标0当做k,如果有比min小的就存起来放到min,下标放到k;

4次循环,也就是8和7比,7和6比,6和3比,3和1比我们找到1,把1和8交换

得到1 7 6 3 8,所以每次小循环我们定义一个j让j=i+1 直到遍历到n-1也就是最后一个数;

我们来进行函数实现

  1. int main()
  2. {
  3. int n;
  4. int arr[10];
  5. scanf("%d", &n);
  6. for (int i = 0; i < n; i++)
  7. {
  8. scanf("%d", &arr[i]);
  9. }
  10. selectionsort(arr, n);
  11. for (int i = 0; i < n; i++)
  12. {
  13. printf("%d ", arr[i]);
  14. }
  15. return 0;
  16. }
  1. void selectionsort(int arr[10], int n)
  2. {
  3. int i, j, k=0, tmp, min;
  4. for (i = 0; i < n-1; i++)
  5. {
  6. min = arr[i];
  7. k = i;
  8. for (j = i + 1; j < n; j++)
  9. {
  10. if (arr[j] < min)
  11. {
  12. min = arr[j];
  13. k = j;
  14. }
  15. }
  16. tmp = arr[i];
  17. arr[i] = min;
  18. arr[k] = tmp;
  19. }
  20. }

函数实现;

3,插入排序

插入排序的思路就是扑克牌,假若我们手里有13478这样的牌,我们得到一个数字6的牌我们会放哪?是不是会放到4和7之间,这就是插入排序,从头遍历,找到一个数从这个数个前面一个一个向前比,如果比后一个数小比前一个数大就停下,不是就继续向前遍历直到n=0;

还是一刚才的8 7 6 3 1为例嗷;

拿7很8比,7小所以往前走,第一次 7 8 6 3 1;

拿6开始遍历,比8小,往前走,比7小往前走,第二次 6 7 8 3 1;

拿3遍历,比8小往前走,比7小往前走,比6小往前走,第三次 3 6 7 8 1;

拿1遍历,比谁都小走到最前面,第四次 1 3 6 7 8;

  1. void insertionsort(int arr[10],int n)
  2. {
  3. int i, j, k, tmp, min;
  4. for (i = 1; i < n; i++)
  5. {
  6. min = arr[i];
  7. for (j = i-1; j >= 0; j--)
  8. {
  9. if (arr[j] > min)
  10. {
  11. arr[j + 1] = arr[j];
  12. }
  13. else
  14. break;
  15. arr[j] = min;
  16. }
  17. }
  18. }
  19. int main()
  20. {
  21. int n;
  22. int arr[10];
  23. scanf("%d", &n);
  24. for (int i = 0; i < n; i++)
  25. {
  26. scanf("%d", &arr[i]);
  27. }
  28. insertionsort(arr, n);
  29. for (int i = 0; i < n; i++)
  30. {
  31. printf("%d ", arr[i]);
  32. }
  33. return 0;
  34. }

代码就完成了

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

闽ICP备14008679号