初入排序之家--插入排序和选择排序

288 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

前言

 每天一小步,成功一大步。大家好,我是程序猿小白 gw_GW,很高兴能和大家一起学习每天小知识。

以下内容部分来自于网络,如有侵权,请联系我删除,本文仅用于学习交流,不用作任何商业用途。

摘要

 本文主要讲诉选择排序和插入排序,由这两个简单的排序勾起读者对排序算法的兴趣。

1. 选择排序

主要思想:

每次从未排序元素中选取最小值,把最小值放到已排序的末尾。

 void select_sort( int arr[], int len ){
     for(int i = 0; i< len-1; i++){//前n-1个位置确定,则第n个位置也已确定 
         int min = i;//记录最小值下标,初始为0 
         for(int j = i+1; j < len; j++){//从未排序序列中,找最小值下标并记录 
             if(arr[j] < arr[min]){
                 min = j;
             }
         }
         //找到最小的值就交换,如果当前就是最小值则不交换 
         if(min !=i ){
             int temp = arr[i];
             arr[i] = arr[min];
             arr[min] = temp;
         }
     }
 }

主要注意一些问题,比如边界问题,交换时的条件,都是对算法的进一步优化。

选择排序的时间复杂度,最坏情况和平均情况都是O(n*2)。并且是一种不稳定排序。(遇到相同值时位置会改变)

如果想要进阶就学习堆排序。可以参考深入浅出理解堆排序 ,堆排序也是不稳定排序。

2. 插入排序

主要思想:

第一个元素当作已排序的元素,从第二个元素开始,在未排序的元素中逐个和已排序的元素比较,如果小于已排序的元素就把已排序的元素后移,直到找到正确的位置,最后把该元素放到正确的位置。

 void insert_sort( int arr[], int len ){
     //将第一个元素默认为已排序,从未排序的元素中依次与前面已排序的元素进行比较,
     //如果比前面元素小,并且未到边界,则把前面元素后挪。 
     for(int i = 1; i < len; i++){
         int key = arr[i];
         int j = i-1;    
         while(j >= 0 && key < arr[j]){
             arr[j+1] = arr[j];
             j--;
         }
         arr[j+1] = key;
     }
 }

插入排序的时间复杂度是最坏情况和平均情况都是O(n*2),是一种稳定排序。

如果想要进阶就学习希尔排序,希尔排序是一种不稳定的排序。

结语

以上就是我对选择排序和插入排序的一些浅见,希望能对读者有所帮助,如有不正之处,欢迎掘友们批评指正。