算法排序——插入排序
一、排序
1、算法的稳定与不稳定
在排序的数组当中,其中有两个相同的元素进行排序:
若排序前后位置不变,则是稳定的。
若排序前后位置发生改变,则是不稳定的
2、排序分类(内部外部)
3、排序模拟化网站
https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
二、插入排序
1、算法思想:
每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中,直到全部记录插入完成为止。
- 例子:若递增排序
1.会从第二个元素入手,与之前元素进行对比。
2.若前面元素大于此元素,那么将前一个个元素,依次进行往后移动。
3.将此元素,进行插入到前一个为止。
2、代码实现:
void InsertSort(int A[],int n){
int i,j,temp;
for(i=1;i<n;i++){
if(A[i-1]>A[i]){
temp=A[i];
//若i-1大于i的值,那么记录此时i的值。
for(j=i-1;j>=0 && A[j]>temp; j--)
// 若有i-1有大于i的值,依次往后移动
A[j+1]=A[j]
}
A[j+1]=temp;
//将此时的i的值,插入到排好序的位置
}
}
3、代码的仔细解读:
-i表示的是:需要运行n-1次循环,
是因为从第二个元素开始,分别于前面排序号的序列进行比较。
直到最后一个元素位置。
所以,i初始化是1。范围是 1到i<n (是因为索引是从0开始)
-j表示的是:i-1开始往前依次,是否大于与此时的i的值。
j初始化是i-1 结束是:不大于此时i的值。
-temp:是用来临时存储此时i的值。
作用是:如果前面的值大于此时i的值,
那么前面的值会往后移动,从而会覆盖此时i的值。
A[j+1]=temp; 此时为什么是j+1 :
作用是:将此时的i的值,插入到排好序的位置
是因为:由于经过上面的for循环以后,还进行了j--,所以要j+1
上面for循环作用是:将前面排好序的数组,从j=i-1开始依次往后
与i进行比较,
直到:
不大于第一个元素,
或者
经过了第一个元素的索引位置0 以后,
再次回到for循环,进行了j--
那么此时的j=-1,不符合for循环条件,跳出了循环。
所以,要进行 A[j+1] = temp;
4、算法复杂度 O(n2) 稳定
5、优化——折半排序插入排序
三、希尔排序
1、希尔排序算法思想:
- 插入排序的时间复杂度是0(n2),如果是有序最好情况下,一共需要循环n-1次,比较n-1即可。
- 以上的知:插入排序在基本有序的情况下,时间复杂度可以大大降低。而我们可以通过希尔排序,对元素尽行大部分有序,在使用插入排序进行全局有序。
- 希尔排序:先追求表中元素部分有序,在逐渐逼近全局有序。
2、代码实现: