插入排序(数组&&链表)

30 篇文章 1 订阅
10 篇文章 1 订阅

//思想:将数组分为有序和无序两部分
//有序:a[0]
//无序:a[1]~a[n-1]
//遍历无序区间的所有元素,每次取出无序区间的第一个元素,a[i]
//和有序区间的元素进行比较,将a[i]插入到有序区间的合适位置

#include<bits/stdc++.h>
#define N 8
void InsertSort(int a[])
{
	int i,j,x;
	for(i=1;i<N;i++){
		x=a[i];//x存取无序首元素值 
		for(j=i-1;j>=0&&a[j]>x;a[j+1]=a[j],j--);//对有序进行插入排序 
		a[j+1]=x;//数组元素移动完后要将小的元素赋值,实现插入 
	}
}
int main()
{
	int a[N];
	int i;
	for(i=0;i<N;i++){//输入数组元素 
		scanf("%d",&a[i]);
	}
	InsertSort(a);//插入排序 
	for(i=0;i<N;i++){//输出 
		printf("%4d",a[i]);
	}
	return 0;
}

//链表实现插入排序
//思想与数组类似,不过用链表来表示

#include<bits/stdc++.h>
#define N 8
typedef struct node{
	int data;
	struct node *next;
}ElemSN;
ElemSN *Createlink(int a[])
{
	ElemSN *head=NULL,*tail;
	for(int i=N-1;i>=0;i--){//逆向建链 
		tail=(ElemSN *)malloc(sizeof(ElemSN));
		tail->data=a[i];
		tail->next=head;
		head=tail;
	}
	return head;
}
ElemSN *InsertSortLink(ElemSN *head)
{
	ElemSN *ho,*p,*q=NULL,*m;
	ho=head->next;
	head->next=NULL;
	while(ho){
		m=ho;//指向无序链表首结点
		ho=ho->next;//无序链表头指针后移
		m->next=NULL;//将待插元素从无序链断开
		for(p=head;p&&p->data<m->data;q=p,p=p->next);//找到合适的待插位置
		if(p==head){//头插 
			m->next=head;
			head=m;
		}
		else{//中间尾插 
		m->next=q->next;
		q->next=m;
		}
	}
	return head;
}
void PrintLink(ElemSN *head)
{
	if(head){//递归输出排好序的链表
		printf("%d",head->data);
		if(head->next){
			printf("->");
		}
		PrintLink(head->next);
	}
} 
int main()
{
	int a[N];
	int i;
	for(i=0;i<N;i++){//输入数组元素 
		scanf("%d",&a[i]);
	}
	ElemSN *head=NULL;
	head=Createlink(a);//创建链表 
	head=InsertSortLink(head);//插入排序 
	PrintLink(head);//输出链表 
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值