考研之数据结构029_算法排序_插入排序、希尔排序

一、排序

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、代码实现:

在这里插入图片描述
在这里插入图片描述

3、不稳定、只能数组,不能链表

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43989347/article/details/117425180