排序算法之插入排序和交换排序

本文详细介绍了几种常见的排序算法,包括直接插入排序、冒泡排序及快速排序等。每种算法都配有详细的解释和伪代码,方便读者理解算法的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

排序就是将一组对象按照规定的次序重新排列的过程,排序往往是为检索服务的。排序算法有很多,很难确定一种公认的最好的方法,没种排序都有适合的不同情况,在实际应用中选择适当的方法。

插入排序

直接插入排序

直接插入排序是一种简单的排序方法,它的基本思想是依次将每个记录插入到一个已排好序的有序表中去,从而得到一个新的、记录数增加1的有序表。

代码如下

<span style="font-size:18px;">void StraightInsertSort(List R,int n)
{
	for (i=2;i<=n;i++)				//n为表长,从第二个记录起进行插入
	{
		R[0]=R[i];					//第i个记录复制为岗哨
		j=i-1;	
		while(R[0].key<R[j].key)		//与岗哨比较,直至键值不大于岗哨键值
		{
			R[j+1]=R[j];			//将第j个记录赋值给第j+1个记录
			j--;
		}
		R[j+1]=R[0];				//将第i个记录插入到序列中
	}
}
</span>

直接排序的算法简单,容易理解,容易实现,时间复杂度为O(n²),直接排序算法是稳定的。

交换排序

冒泡排序

冒泡排序法是一种交换排序方法,其过程是首先将第一个记录的键值和第二个记录的键值进行比较,若为逆序,则将这两个记录交换,然后继续比较第二个和第三个记录的键值。

 

代码如下

<span style="font-size:18px;">void BubbleSort(List R,int n)
{
	int I,j,temp,endsort;
	for(i=1;i<=n-1;i++)
	{
		endsort=0;
		for(j=1;j<=n-i-1;j++)
		{
			if(R[j].key>R[j+1].key)
			{
			temp=R[j];
			R[j]=R[j+1];
			R[j+1]=temp;
			endsort=1;
			}
		}
		if(endsort ==0 )
		{
		<span style="white-space:pre">	</span>break;
		}
	}
}
</span>

冒泡排序为稳定的排序算法,时间复杂度为O(n²)。

快速排序

快速排序是交换排序的一种,实质上是对冒泡排序的一种改进。它的进本思想:在n个记录中取某一个记录的键值为标准,通常取第一个记录键值为基准,通过一趟排序将待排序的记录分为小于或等于这个键值和大于这个键值的两个独立的部分,这时一部分的记录键值均比另一部分记录的键值小,然后,对这两部分记录继续分别进行快速排序,以达到整个序列有序。

 

代码如下:

<span style="font-size:18px;">int QuickPartition(List R,int low,int high)
{
	//对R[low],R[low+1],…R[high]子序列进行一趟快速排序
	x=R[low];				//置初值
	while(low<high)
	{
		while(low<high) && (R[high].key>=x.key)
		{
			high--;
		}
		R[low]=R[high];
		while((low<high) && (R[low].key<=x.key))
		{
			low++;
		}
		R[high]=R[low];
	}
		R[low]=x;
		return low;
}

void QuickSort(List R,int low,int high)	
//对记录序列R[low],R[low+1],…R[high]进行快速排序
{
	if(low<high)
	{
		temp=QuickPartition(R,low,high);
		QuickSort(R,low,temp-1);
		QuickSort(R,temp+1,high);
	}
}</span>

就平均时间性能而言,快速排序方法最佳,其时间复杂度为O(nlog(2)n)。但在最坏的情况下,即对几乎已是安排好序的输入序列,该算法的效率较低,近似于O(n²)。另外,对于较小的n值该算法效果不明显;反之,对较大的n值效果较好。

以上是对插入排序和交换排序的总结,下一篇会对选择排序和归并排序进行总结。

评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值