• 排序算法-----插入排序


    目录

    前言:

    插入排序

     原理图

    代码实现

    分析总结

    二分法插入排序

    代码实现


    前言:

            嗨嗨^_^,米娜桑,今天我们继续学习排序算法中的插入排序,激不激动,兴不兴奋呢!好了废话不多说,下面请看正文!

    插入排序

             插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法 。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。

     原理图

     初始数组如下所示:

    第一次,拿到第一个数字,因为第一个数字不存在顺序,无法进行比较,所以不需要进行相关的操作 第二次,拿到第二个数字 1 ,与前面的数字进行比较,发现6比1大,那么就进行数字交换,如下图所示:

    第三次,拿到数字9,发现9,比前面的两个数字都要大,那么就保持位置不变,继续往后看。

     第四次,拿到数字2,此时发现,2比9小,比6小,比1大,那么就把2插入到1和6之间,6和9依次向后移动一位。

    第五次,拿到数字4,此时把数字4插入到2和6之间,同样的6和9依次往后移动一位。

    第六次,拿到数字8,此时8比9小,那么就插入到9的前面即可,9向后移动一位

    第七次,拿到12,发现12比前面已排序好了的数字都要大,那么位置不变。

     第八次,拿到10,此时10比12小,比9大,那么就插入到9和12之间,12向后移动一位。

    看,这样就完成了排序了! 

    动态图展示 

    代码实现

    1. #include
    2. #include
    3. #include
    4. #include
    5. //直接插入
    6. void insert_sort(int* n, int length) {
    7. for (int i = 0; i < length; i++) {
    8. int temp = n[i];
    9. for (int j = i - 1; j >= 0; j--) {
    10. if (n[j] > temp) {
    11. n[j + 1] = n[j];
    12. n[j] = temp;
    13. }
    14. }
    15. }
    16. }
    17. int main() {
    18. int array[10];
    19. srand((unsigned)time(0));
    20. for (int i = 0; i < 10; i++) {
    21. array[i] = rand() % 20;
    22. }
    23. for (int i = 0; i < sizeof(array) / sizeof(int); i++) {
    24. printf("%d ", array[i]);
    25. }
    26. printf("\n排序后:");
    27. insert_sort(array, sizeof(array) / sizeof(int));
    28. for (int i = 0; i < sizeof(array) / sizeof(int); i++) {
    29. printf("%d ", array[i]);
    30. }
    31. }
    32. //输出结果:
    33. //9 16 13 4 8 12 2 0 7 2
    34. //排序后:0 2 2 4 7 8 9 12 13 16

    分析总结

    时间复杂度

    最好情况就是全部有序,此时只需遍历一次,最好的时间复杂度为O ( n );如果完全逆序的话,那么时间复杂度就会变为O(n^2),直接翻倍。所以时间复杂度为O(n^2) 。

    空间复杂度

    这里没有去开辟空间,空间是一个常量,所以空间复杂度是O(n).

    稳定性 

     遇到相同大小元素过程中,依然是插入到相同元素的前边,相对位置没有发生改变,所以稳定性好。

    二分法插入排序

     二分法插入排序是对插入排序的代码优化,整体的实质上还是插入排序,时间复杂度依然是不会改变的O(n^2),当n较大时,总排序码比较次数比直接插入排序的最坏情况要好得多,但比其最好情况要差。同样的,二分法插入排序是稳定的。

     

    代码实现

    1. #include
    2. #include
    3. #include
    4. #include
    5. //二分法插入排序
    6. void insert_bin_sort(int *n,int length) {
    7. int left, right, mid;
    8. for (int i = 1; i < length; i++) {
    9. left = 0;
    10. right = i - 1;
    11. while (left <= right) {
    12. mid = (left + right) / 2;
    13. if (n[mid] > n[i]) {
    14. right = mid - 1;
    15. }
    16. else
    17. {
    18. left = mid + 1;
    19. }
    20. }
    21. int temp = n[i];
    22. for (int j = i; j > left; j--) {
    23. n[j] = n[j - 1];
    24. }
    25. n[left] = temp;
    26. }
    27. }
    28. int main() {
    29. int array[10];
    30. srand((unsigned)time(0));
    31. for (int i = 0; i < 10; i++) {
    32. array[i] = rand() % 20;
    33. }
    34. for (int i = 0; i < sizeof(array) / sizeof(int); i++) {
    35. printf("%d ", array[i]);
    36. }
    37. printf("\n排序后:");
    38. insert_bin_sort(array, sizeof(array) / sizeof(int));
    39. for (int i = 0; i < sizeof(array) / sizeof(int); i++) {
    40. printf("%d ", array[i]);
    41. }
    42. }
    43. //输出结果:
    44. //15 0 15 3 5 7 9 6 12 14
    45. //排序后:0 3 5 6 7 9 12 14 15 15

    以上就是今天的全部内容了,我们下一期再见!

    分享一张壁纸: 

  • 相关阅读:
    executor-cores参数并未对vcores生效的原因分析
    函数的声明与作用域
    Redis 基础总结
    极简的Http请求client推荐-OkHttp
    标准lua和luajit的一个代码测试对比
    浮点数的加减法运算
    openGauss学习笔记-115 openGauss 数据库管理-设置安全策略-设置密码安全策略
    尚硅谷_vue
    wpf中prism框架
    ZooKeeper+kafka消息队列群集部署
  • 原文地址:https://blog.csdn.net/m0_73633088/article/details/132833308