数据结构--排序算法

1.归并排序

#include<iostream>
using namespace std;
#include<ctime>
#include<cstdlib> 

void sort(int *e1,int *e2,int low,int mid,int high)
{//传入两个有序数组,将其连接成一个新的有序数组
	int i = low;
	int j = mid+1;
	int k = low; 
	while(i<=mid&&j<=high)
	{
		if(e1[i]<e1[j])
		e2[k++] = e1[i++];
		else
		e2[k++] = e1[j++];
	}
	while(i<=mid)
	e2[k++] = e1[i++];
	while(j<=high)
	e2[k++] = e1[j++];
}
void Msort(int *R,int *T,int low,int high)
{//将R归并排序后放到T中
	int *S= new int[100];
	if(low == high)
	T[low] = R[low];//low等于high则将R的
	else
	{
		int mid = (high+low)/2;
		Msort(R,S,low,mid);//对左数组进行递归归并排序,结果放到数组S[low,mid]中
		Msort(R,S,mid+1,high);//对右数组进行递归归并排序,结果放到数组S[mid+1,high]中
		sort(S,T,low,mid,high);//将数组S[low,mid]和S[mid+1,high]归并到数组T[low,high]中
	}
 } 
 
 void MergeSort(int *R)
 {
 	Msort(R,R,0,100);
 }
 
 int main()
 {
 	srand((int)time(0));
 	int * R = new int[100];
 	for(int j = 0;j<100;j++)
 	{
 		R[j]=(rand()%100+1);
 		cout<<R[j]<<" ";
	 }
	 cout<<endl;
	 cout<<endl;
 	MergeSort(R);
 	for(int i = 1;i<101;i++)
 	{
 		cout<<R[i]<<" ";
	 }
	 return 1;
 }

3.直接插入排序

#include<iostream>
using namespace std;
#include<ctime>
#include<cstdlib> 
/* 直接插入排序一个单链表*/

typedef struct Node
{
	int data;
	struct Node *next;
}*LinkList,Node;

void Init(LinkList &L)
{
	L = new Node;
	L->next = NULL;
 } 
void Create(LinkList &L)
{//使用随机数创建一个单链表

	for(int i= 0; i<10;i++)
	{
		Node *p = new Node;
		p->data = (rand()%100+1); 
		p->next = L->next;
		L->next = p;
	}
}

void Sort(LinkList &L)
{
	Node* p,*q,*r,*u;
	p = new Node;
	q = new Node;
	u = new Node;
	p = L->next->next;
	L->next->next = NULL;
	while(p)
	{
		r = L;
		q = L->next;
		while(q&&q->data<p->data)
		{
			r = q;//从首元结点开始遍历,找到最大的一个小于p节点的节点
			q = q->next;
		 } 
		 u = p->next;//用u指针记录p后面的节点
		 p->next = q;//q为大于等于p的值的节点,将其赋值为q->next
		 r->next = p;//r为最大的一个小于p的节点,将其next指针赋值为p
		 p = u;//为了继续循环,将p的值赋值为u
	}
}

void Trave(LinkList &L)
{
	Node *p = L->next;
	while(p)
	{
		cout<<p->data;
		p = p->next;
	}
}
int main()
{
	srand((int) time(0));
	LinkList L;
	Init(L);
	Create(L);
	Trave(L);
	cout<<endl;
	Sort(L);
	Trave(L);
	system("pause");
	return 1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值