当前位置:   article > 正文

直接插入排序和选择排序_直接选择和直接插入

直接选择和直接插入

(一)直接插入排序

思路:

(1)用一个临时变量存放待排序的数字;

(2)从数组前依次遍历找第一个比待排序数字大的数字的位置;

(3)将从待排序的数字位置开始,到找的要插入的数字的位置之间的数字向后挪一位,最后将待排序数字插入到找到的位置;

代码如下:

  1. void Insert_Sort( int *arr,int len )
  2. {
  3. int tmp = 0;//当作哨兵位
  4. for( int i = 1; i < len; ++i )
  5. {
  6. tmp = arr[i];
  7. for( int j = 0 ; j < i ;++j )
  8. {
  9. if( tmp < arr[j] )//找到第一个比tmp大的数字;
  10. {
  11. break;
  12. }
  13. }
  14. for( int k = i - 1 ;k >= j ;j-- )//将i-j之间的数字向后挪动一位,
  15. {
  16. arr[k+1] = arr[k];
  17. }
  18. arr[j] = tmp ;//在j的位置插入待排序数字
  19. }
  20. }

上述代码的时间复杂度为O(n^2),如果给出的数字本来就有序,即最好的情况下时间复杂度也为O(n^2),空间复杂度为O(1);

最好情况比如 12345 也是 O(n~2);从前往后找太浪费时间

优化:

采取从后往前找比待排序数字小的数字的位置,插入在此数字的后面,在没有找到之前将数字往后挪动一位;
最好情况 12345 时间复杂度是O(n);空间复杂度 O(1)

代码如下:

  1. void Insert_Sort2(int *arr,int len)
  2. {
  3. int i;
  4. int j;
  5. int tmp;
  6. for(i = 1; i < len; i++)
  7. {
  8. tmp = arr[i];
  9. for(j = i-1;j >= 0;j--)//从哨兵位之前开始 向前找
  10. {
  11. if(arr[j] <= tmp)//找第一个比tmp小的数字
  12. {
  13. break;
  14. }
  15. else
  16. {
  17. arr[j+1]=arr[j];//没找到之前将数字往后挪
  18. }
  19. }
  20. arr[j+1] = tmp;//找到了将tmp插入在其后面
  21. }
  22. }

(2)选择法排序

思路:

第1趟,在待排序记录r[1]~r[n]中选出最小的记录,将它与r[1]交换;第2趟,在待排序记录r[2]~r[n]中选出最小的记录,将它与r[2]交换;以此类推,第i趟在待排序记录r[i]~r[n]中选出最小的记录,将它与r[i]交换,使有序序列不断增长直到全部排序完毕。代码如下:

  1. void Select_Sort(int *arr,int len)
  2. {
  3. for(int i = 0;i < len;i++)
  4. {
  5. int minIndex = i;
  6. for(int j = i+1;j < len;j++)
  7. {
  8. if(arr[j] < arr[minIndex])
  9. {
  10. minIndex = j;
  11. }
  12. }
  13. if(minIndex != i)
  14. {
  15. int tmp = 0;
  16. tmp = arr[i];
  17. arr[i] = arr[minIndex];
  18. arr[minIndex] = tmp;
  19. }
  20. }
  21. }

时间复杂度:最好情况  12345 是O(n^2)  最坏情况  54321 O(n^2) 空间复杂度:O(1)

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

闽ICP备14008679号