小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
前言
每天一小步,成功一大步。大家好,我是程序猿小白 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),是一种稳定排序。
如果想要进阶就学习希尔排序,希尔排序是一种不稳定的排序。
结语
以上就是我对选择排序和插入排序的一些浅见,希望能对读者有所帮助,如有不正之处,欢迎掘友们批评指正。