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

目录

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 学习链接

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 直接插入排序:将待排序的数列分为有序区和无序区,从无序区中取出一个元素,插入到有序区中的正确位置,直到无序区为空。时间复杂度为O(n^2)。 2. 排序:将待排序的数列分成若干个子序列,对每个子序列进行插入排序,缩小增量,直到增量为1,最后对整个数列进行一次插入排序。时间复杂度为O(nlogn)。 3. 冒泡排序:比较相邻的两个元素,如果前者大于后者,则交换它们的位置,一次冒泡可以把一个元素排到正确的位置,重复进行n-1次,直到排序完成。时间复杂度为O(n^2)。 4. 快速排序:选定一个基准值,将数列分为左右两个部分,左边的元素都小于基准值,右边的元素都大于基准值,递归地对左右两个部分进行快速排序。时间复杂度为O(nlogn)。 5. 简单选择排序:从待排序的数列中选择最小的元素,放置到已排序数列的末尾,重复该过程,直到待排序数列为空。时间复杂度为O(n^2)。 6. 堆排序:先将待排序的数列构建成一个最大堆,然后将堆顶的元素与末尾元素交换位置,并重新构建最大堆,重复该过程,直到排序完成。时间复杂度为O(nlogn)。 7. 归并排序:将待排序的数列分成两个部分,对每个部分进行归并排序,然后将两个有序的部分合并成一个有序的数列,递归地进行该过程,直到排序完成。时间复杂度为O(nlogn)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值