C语言实现2-路插入排序

2-路插入排序
  1. 实现思想
    • 2-路插入排序算法是在折半插入排序的基础上对其进行改进,减少其在排序过程中移动记录的次数从而提高效率。
    • 具体实现思路为:另外设置一个同存储记录的数组大小相同的数组 d,将无序表中第一个记录添加进 d[0] 的位置上,然后从无序表中第二个记录开始,同 d[0] 作比较:如果该值比 d[0] 大,则添加到其右侧;反之添加到其左侧。在这里的数组 d 可以理解成一个环状数组。
  2. 时间复杂度
    • 最好情况:O(n)
    • 最坏情况:O(n²)
    • 平均时间复杂度:O(n²)
  3. 空间复杂度
    • O(n)
  4. 稳定性
    • 稳定
代码
	#include<stdio.h>
	
	#define MaxSize 8  //2-路插入排序使用
	
	//2-路插入排序
	void InsertSort2(int r[],int n){
		int i,j,first,final;
		int d[MaxSize];          //辅助数组,可视为循环数组
	
		if(n>0){
			d[0]=r[1];           //初始化辅助数组d
			first=final=0;       //first指向辅助数组d中最小的元素,final指向辅助数组d中最大的元素
		}
	
		for(i=2;i<=n;i++){       //在辅助数组d对r中元素进行排序
			if(r[i]<d[first]){   //待插入元素小于d中最小元素,插入first左边
				first=(first-1+MaxSize)%MaxSize;
				d[first]=r[i];
			}
			else if(r[i]<d[final]){  //待插入元素大于d中最小元素,小于d中最大元素,插入first和final之间
				j=final;
				do{
					d[(j+1)%MaxSize]=d[j];
					j=(j-1+MaxSize)%MaxSize;
				}while(r[i]<d[j]);
				d[(j+1)%MaxSize]=r[i];
				final=(final+1)%MaxSize;
			}
			else if(r[i]>d[final]){  //待插入元素大于d中最大元素,插入final右边
				final=(final+1)%MaxSize;
				d[final]=r[i];
			}
		}
	
		for(i=1,j=first;i<=n;i++,j=(j+1)%MaxSize) //将d中排好序的元素赋值到r中
			r[i]=d[j];
	}
	
	void Output(int r[],int n){
		int i;
		for(i=1;i<=n;i++){   //从r[1]开始输出,r[0]作为哨兵,不输出
			printf("%d ",r[i]);
		}
		printf("\n");
	}
	
	void main(){
		int n=8;  //对8个元素进行排序
		int r[9]={0,3,1,7,5,2,4,9,6}; //r[0]作为哨兵,r[1]到r[8]存储元素
		printf("未排序的集合为:\n");
		Output(r,n);
		InsertSort2(r,n); //2路插入排序
		printf("从小到大排序后的集合为:\n");
		Output(r,n);
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用C语言实现直接插入排序的代码: ```c #include <stdio.h> void InsertionSort(int arr\[\], int size) { int i, j, key; for (i = 1; i < size; i++) { key = arr\[i\]; j = i - 1; while (j >= 0 && arr\[j\] > key) { arr\[j + 1\] = arr\[j\]; j--; } arr\[j + 1\] = key; } } int main() { int arr\[\] = {9, 5, 1, 6, 2, 3, 0, 4, 8, 7}; int size = sizeof(arr) / sizeof(arr\[0\]); InsertionSort(arr, size); for (int i = 0; i < size; i++) { printf("%d ", arr\[i\]); } printf("\n"); return 0; } ``` 这段代码实现了直接插入排序算法。在排序过程中,我们将数组分为有序区和无序区,初始时有序区只包含第一个元素,然后从无序区中依次取出元素,将其插入到有序区的适当位置,使得有序区保持有序。重复这个过程直到无序区为空,即完成了排序。这个算法的时间复杂度是O(n^2),空间复杂度是O(1),它是一种稳定的排序算法。 #### 引用[.reference_title] - *1* [C语言实现----插入排序](https://blog.csdn.net/qq_53436105/article/details/127185417)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [C语言实现-直接插入排序(带图详解)](https://blog.csdn.net/weixin_62529445/article/details/126041868)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [C语言插入排序(直接插入排序)](https://blog.csdn.net/m0_58103115/article/details/125856851)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值