当前位置:   article > 正文

【数据结构】插入排序(一)——直接插入排序_插入(一)

插入(一)

1、直接插入排序算法思想

把n个待排序的元素看出一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。(增量法)

把a[i]插入到a[0]、a[1]、......a[i-1]中的具体实施过程:

先把a[i]赋值给变量tmp,然后将tmp依次与a[i-1]、a[i-2]......进行比较,将比tmp大元素右移一个位置,直到发现某个j(0<=j<=i-1),使得a[j]<=tmp或j为-1,把tmp赋值给a[j+1]。


2、直接插入排序过程演示

                                                      

                                                     图一:直接插入排序 实例过程演示


 3、直接插入排序算法

C语言实现: 

  1. #include <stdio.h>
  2. void InsertSort(int *arr,int len)
  3. {
  4. int tmp;
  5. int i;
  6. int j;
  7. for(i=1;i<len;i++)
  8. {
  9. tmp = arr[i];
  10. for(j=i-1;j>=0;j--)
  11. {
  12. if(arr[j] <= tmp)
  13. {
  14. break;
  15. }
  16. else
  17. {
  18. arr[j+1] = arr[j];
  19. }
  20. }
  21. //for循环简易写法
  22. //for(j=i-1;arr[j]>tmp&&j>=0;j--)
  23. //{
  24. // arr[j+1] = arr[j];
  25. //}
  26. arr[j+1] = tmp;
  27. }
  28. }
  29. void Show(int *arr,int len)
  30. {
  31. for(int i=0;i<len;i++)
  32. {
  33. printf("%d ",arr[i]);
  34. }
  35. printf("\n");
  36. }
  37. int main()
  38. {
  39. int arr[] = {4,9,0,12,34,67,8,91,32,54,66,88,2};
  40. InsertSort(arr,sizeof(arr)/sizeof(arr[0]));
  41. Show(arr,sizeof(arr)/sizeof(arr[0]));
  42. return 0;
  43. }

运行结果:

C++代码实现

  1. void insertSort(vector<int>& nums)
  2. {
  3. for (int i = 1; i < nums.size(); i++)
  4. {
  5. int key = nums[i];
  6. int j = i - 1;
  7. if (nums[i] < nums[i - 1])
  8. {
  9. for (; j >= 0 && key < nums[j]; j--)
  10. {
  11. nums[j + 1] = nums[j];
  12. }
  13. nums[j + 1] = key;
  14. }
  15. }
  16. }

4、总结

1)时间复杂度O(n^2),空间复杂度O(1)。

2)一种稳定型排序算法。

3)适用于n值较小的情况,越有序,排序越快,当原数组为顺序时,时间复杂度为O(n).

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

闽ICP备14008679号