【排序综合】直接插入排序,希尔排序,快速排序,堆排序,冒泡排序,简单选择排序的简介,实现和算法复杂度分析

本文详细介绍了直接插入排序、希尔排序、快速排序、堆排序、冒泡排序和简单选择排序这六种排序算法,包括算法思想、实现代码、复杂度分析及运行结果。这些排序算法在不同场景下有不同的效率表现,适用于不同的数据结构和规模。

目录

1. 直接插入排序

1.1 直接插入排序简介

1. 什么是直接插入排序

2. 排序思想

1.2 排序实现

1. 排序代码

2. 复杂度分析:

3. 运行结果:

1.3 学习链接

2. 希尔排序(分组排序)

2.1 希尔排序简介

1. 什么是希尔排序

2.排序思想

2.2 排序实现

1. 希尔排序代码

2. 复杂度分析

3. 运行结果

2.3 学习链接

3. 快速排序

3.1 快速排序简介

1. 什么是快速排序

2.排序思想

3.2 排序实现

1. 快速排序代码

2. 复杂度分析

3. 运行结果

3.3 学习链接

4. 堆排序

4.1 堆排序简介

1. 什么是堆排序

2.排序思想

4.2 排序实现

1. 堆排序代码

2. 复杂度分析

3. 运行结果

4.3 学习链接

5. 冒泡排序

5.1 冒泡排序简介

1. 什么是冒泡排序

2. 排序思想

5.2 排序实现

1. 冒泡排序代码

2. 复杂度分析

3. 运行结果

5.3 学习链接

6. 简单选择排序

6.1 简单选择排序简介

1. 什么是简单选择排序

2.排序思想

6.2 排序实现

1. 简单选择排序代码

2. 复杂度分析

3. 运行结果

6.3 学习链接

7. 排序算法比较


1. 直接插入排序

1.1 直接插入排序简介

1. 什么是直接插入排序

直接插入排序是一种最简单的排序方法,其基本操作是将需要排序的元素插入到已排好的有序表序列中,从而得到一个完整的有序序列

2. 排序思想

  1. 将待排序序列分为两部分,一部分有序一部分无序。
  2. 我们把第一个元素看作有序序列,从第二个元素到最后为无序序列。
  3. 将无序序列中每一个元素依次插入到有序序列的合适位置–从小到大(从大到小)。

1.2 排序实现

1. 排序代码

void insertsort(struct element a[],int n){         
	int i,j; 
	struct element x;    
	for(i=1;i<n;i++){    
	    if(a[i].key<a[i-1].key)    //反序时 
	    {
	    	x=a[i];
	    	j=i-1;	    	
	    	do      //找a[i].key的插入位置 
	    	{
	    		a[j+1]=a[j];     //将关键字大于a[i].key的记录后移 
	    		count1++;
				j--;
				move1++;
			}while(j>=0&&a[j].key>x.key);
			a[j+1]=x;      //在j+1处插入a[i] 
		    move1=move1+2;
	  }
	  count1++;
	}	
} 

2. 复杂度分析:

时间复杂度:最坏情况下为O(N*N),此时待排序列为逆序,或者说接近逆序
最好情况下为O(N),此时待排序列为升序,或者说接近升序。
空间复杂度:O(1)

3. 运行结果:

1.3 学习链接

数据结构之直接插入排序思想_哔哩哔哩_bilibili

2. 希尔排序(分组排序)

2.1 希尔排序简介

1. 什么是希尔排序

希尔排序是把序列按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量的逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个序列恰好被分为一组,算法便终止。

2.排序思想

  1. 将元素等分为n小组,元素较少时,元素一般以4开始,将组内元素进行排序,一般采取插入排序
  2. 排序完成之后,将元素再次分组(n/2组),组内元素再次排序
  3. 以此类推,当n==1时,排序完成

2.2 排序实现

1. 希尔排序代码

void shellsort(struct element a[],int n){
	int i,j,k;
	struct element tmp;
	k=n/2;     //增量置初值 
	while(k>0)
	{
		for(i=k;i<n;i++)   //对所有组采用直接插入排序 
		{
			tmp=a[i];      //对相隔k个位置一组采用直接插入排序 
			j=i-k; 
			while(j>=0&&tmp.key<a[j].key)
			{
				a[j+k]=a[j];
				j=j-k;
				move2=move2+3; 
			}
			a[j+k]=tmp;
			count2++; 
		}
		k=k/2;   //减小增量 
	}
}

2. 复杂度分析

时间复杂度平均:O(N^1.3)
空间复杂度:O(1)

3. 运行结果

2.3 学习链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值