插入排序


1.直接插入排序

每次选取待插入元素与之前排好序的元素进行比较,比其大,则插入,否则移动元素。

#include <stdio.h>
#define MAX 200

typedef struct{
	int r[MAX];
	int length;
}SqList;

void InitList(SqList &L){
	int n;
	
	printf("please input the num of count:\n");
	scanf("%d",&n);
	
	printf("please input the numbers:\n");
	for(int i = 1; i <= n; i ++)
		scanf("%d",&L.r[i]);
	
	L.length = n;
}

void SortList(SqList &L){
	int i,j;
	
	for(i = 2; i <= L.length; i ++){
		
		if(L.r[i] < L.r[i - 1]){
			L.r[0] = L.r[i];//用0下标处来保留当前值 
			
			for(j = i - 1; L.r[0] < L.r[j]; j --)//当前元素值大于待排序元素时,移动元素 
				L.r[j + 1] = L.r[j];
			
			L.r[j + 1] = L.r[0];//对元素进行插入 
		}
	}
}

int main(){
	SqList L;
	
	InitList(L);
	
	SortList(L);
	
	for(int i = 1; i <= L.length; i ++)
		printf("%3d",L.r[i]);
	putchar('\n');
	
	return 0;
}
2.折半插入排序

大体思想和直接插入排序相同,只是在查找元素时采用折半查找。

#include <stdio.h>
#define MAX 200

typedef struct{
	int r[MAX];
	int length;
}SqList;

void InitList(SqList &L){
	int n;
	
	printf("please input the num of count:\n");
	scanf("%d",&n);
	
	printf("please input the numbers:\n");
	for(int i = 1; i <= n; i ++)
		scanf("%d",&L.r[i]);
	
	L.length = n;
}

int BinSearch(SqList L, int cur, int left, int right){
		if(left > right)//当低下标大于高下标时,返回right,此时L.r[right] < L.r[left]
			return right;
		
		int mid = (left + right) / 2;
		
		if(L.r[cur] > L.r[mid])
			BinSearch(L,cur,mid+1,right);
		else 
			BinSearch(L,cur,left,mid-1);
			 
}

void SortList(SqList &L){
	int i,j,k;
	
	for(i = 2; i <= L.length; i ++){
		
		if(L.r[i] < L.r[i - 1]){
			L.r[0] = L.r[i];
			
			k = BinSearch(L,0,1,i-1);//进行折半查找 
	
			for(j = i - 1; j > k; j --)
				L.r[j + 1] = L.r[j]; 
			
			L.r[k + 1] = L.r[0];
		}
	}
}

int main(){
	SqList L;
	
	InitList(L);
	
	SortList(L);
	
	for(int i = 1; i <= L.length; i ++)
		printf("%3d",L.r[i]);
	putchar('\n');
	
	return 0;
}

3.2-路插入排序

借助一个D辅助变量,把L中第一个元素存入D中,并设两个变量first和final,并且对其进行初始化。每次选取元素与D中的第一个元素比较,大于D[0],则看final,如果final仍是初始值,则只需令final++赋值即可,否则,从final处开始对元素进行比较,直到找到一个元素比待插入元素的值小或者下标等于0,然后插入,final++。不大于D[0],则看first,如果first仍是初始值,只需令first=L.length-1赋值即可,否则,从first处开始对元素进行比较,直到有元素大于待插入元素或者下标等于L.length-1,最后令first--。

#include <stdio.h>
#define MAX 200

typedef struct{
	int r[MAX];
	int length;
}SqList;

void InitList(SqList &L){
	int n;
	
	printf("please input the num of mount:\n");
	scanf("%d",&n);
	
	printf("please input the numbers:\n");
	for(int i = 0; i < n; i ++)
		scanf("%d",&L.r[i]);
	L.length = n;
}

void SortList(SqList L, SqList &D){
	D.length = L.length;	D.r[0] = L.r[0];
	int first = 0,final = 0,i,j;//对first,final初始化 
	
	for(i = 1; i < L.length; i ++){
		if(L.r[i] > L.r[0]){
			if(!final)//判断final是否为初始值,若为初始值,则自加,否则移动元素进行查找 
				D.r[++ final] = L.r[i];
			else{
					for(j = final; j > 0; j --){
						if(D.r[j] > L.r[i])
							D.r[j + 1] = D.r[j];
						else{
							D.r[j + 1] = L.r[i];
							break;
						}
					} 
					final ++;
			}
		}
		else{
			if(!first){//同final原理 
				D.r[L.length - 1] = L.r[i];
				first = L.length - 1;
			}
			else{
				for(j = first; j < L.length; j ++)
					if(D.r[j] < L.r[i])
						D.r[j - 1] = D.r[j];
					else{
						D.r[j - 1] = L.r[i];
							break;
					}
					first --;
			}
		}
	}
	
	int temp = D.length;
	i = first;
	
	while(temp --){//进行循环输出,把顺序表想成循环表即可 
		printf("%3d",D.r[i % D.length]);
		i ++;
	}
	putchar('\n');
}

int main(){
	SqList L,D;
	
	InitList(L);
	
	SortList(L,D);
	
	return 0;
} 

4.表插入排序

即用静态链表对待排序数组进行排序。首先把数组中的第一个元素赋值给静态链表,而后选取待插入元素进行比较,进行下标的变换。

#include <stdio.h>
#define MAX 100

typedef struct{
	int r[MAX];
	int length;
}SqList;
typedef struct{ 
	int data;
	int orde;
}list[MAX];//建立结构体数组用来作为静态链表存储 
typedef struct{
	list l;
}SqSList;

void InitList(SqList &L){//初始化顺序表 
	int n,i;
	
	printf("please input the num of mount:\n");
	scanf("%d",&n);
	
	printf("please input the numbers:\n");
	for(i = 1; i <= n; i ++)
		scanf("%d",&L.r[i]);
	L.length = n;
}

void SortList(SqList L){
	SqSList S;
	int i,j = 1,k,n,flag;
		
	S.l[j].data = L.r[1];	S.l[j].orde = 0;//对第一个元素进行赋值,并把orde值赋值为0; 
											
	for(i = 2; i <= L.length; i ++){//每次取最小值与要插入的数据进行比较 
		if(L.r[i] < S.l[j].data){//待插入元素小于已插入最小值 
			S.l[i].data = L.r[i];
			S.l[i].orde = j;
			j  = i;	
		}
		else{
			k = j;	flag = 0;//标志位flag用来判断待插入元素是否比表中的所有元素都要大 
			while(L.r[i] > S.l[k].data){
				if(!S.l[k].orde){
					flag = 1;
					break;
				}
				
				n = k;//用n来保留上一元素的序号 
				k = S.l[k].orde;
			}
			if(flag){
				S.l[i].data = L.r[i];
				S.l[i].orde = S.l[k].orde;
				S.l[k].orde = i;
			}
			else{
				S.l[i].data = L.r[i];
				S.l[i].orde = k;
				S.l[n].orde = i;
			}	
		}
	}

	i  = 0;
	while(i < L.length){
		printf("%3d",S.l[j].data);
		j = S.l[j].orde;
		i ++;
	}
	putchar('\n');
}

int main(){
	SqList L;
	
	InitList(L);
	
	SortList(L);

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值