排序子系统


#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef int KeyType;
typedef struct
{
	KeyType Key;
}LineList;
void InsertSort(LineList r[],int n)
{
	int i,j;
	for(i=2;i<=n;i++)
	{
		r[0]=r[i];
		j=i-1;
		while(r[0].Key<r[j].Key)
		{
			r[j+1]=r[j];
			j=j-1;
		}
		r[j+1]=r[0];
	}
}
void ShellSort(LineList r[],int n)
{
	int i,j,d;
	d=n/2;
	while(d>0)
	{
		for(i=d;i<=n;i++)
		{
			r[0]=r[i];
			   j=i-d;
			while(j>=0 && r[0].Key<r[j].Key)
			{
				r[j+d]=r[j];
				j=j-d;
			}
			r[j+d]=r[0];
			j=j-d;   
		}
		d=d/2;
	}
}
void BubbleSort(LineList r[],int n)
{
	int i,j,exchange;
	LineList temp;
	for(i=1;i<n;i++)
	{
		exchange=0;
		for(j=1;j<=n-i;j++)
		if(r[j].Key>r[j+1].Key)
		{
			temp=r[j];
			r[j]=r[j+1];
			r[j+1]=temp;
			exchange=1;
		}
		if (exchange==0) return;
	}
}

void QuickSort (LineList r[],int first,int end)
{
	int i,j;
	LineList temp;
	i=first; j=end; temp=r[i];
	while(i<j)
	{
		while (i<j && temp.Key<= r[j].Key) j--;
		  r[i]=r[j];
		while (i<j && r[i].Key<=temp.Key) i++;
		  r[j]=r[i];  
	}
	r[i]=temp;
	if (first<i-1) QuickSort(r,first,i-1);
	if (i+1<end) QuickSort(r,i+1,end);
}
void SelectSort(LineList r[],int n)
{
	int i,j,k;
	LineList x;
	for(i=1;i<=n;i++)
	{
		k=i;
		for(j=i+1;j<=n;++j)
		if(r[j].Key<r[k].Key)
		  k=j;
		if(k!=i)
		{ x=r[i];r[i]=r[k];r[k]=x;}  
	}
}
void Sift(LineList r[],int low,int high)
{
	int i=low,j=2*i;
	LineList tmp=r[i];
	while(j<=high)
	{
		if(j<high && r[j].Key< r[j+1].Key)
		  j=j+1;
		if(tmp.Key<r[j].Key)
		{
			r[i]=r[j];
			i=j;
			j=2*i;
		}  
		else break;
	}
	r[i]=tmp;
}
void HeapSort(LineList r[],int n)
{
	int i;
	LineList tmp;
	for(i=n/2;i>=1;i--)
	  Sift(r,i,n);
	for(i=n;i>=1;i--)
	{
		tmp=r[1];
		r[1]=r[i];
		r[i]=tmp;
		Sift(r,1,i-1);
	}  
}
void Merge(LineList r[],int low,int mid,int high)
{
	LineList *r1;
	int i=low,j=mid+1,k=1;
	r1=(LineList *)malloc((high-low+1)*sizeof(LineList));
	while(i<=mid && j<=high)
	  if(r[i].Key<=r[j].Key)
	    r1[k++]=r[i++];
	  else
	    r1[k++]=r[j++];
	while(i<=mid)
	  r1[k++]=r[i++];
	while(j<=high)
	  r1[k++]=r[j++];
	for(k=1,i=low;i<=high;k++,i++)
	  r[i]=r1[k];    	  
}
void MergePass(LineList r[],int length,int n)
{
	int i;
	for(i=1;i+2*length-1<=n;i=i+2*length)
	  Merge(r,i,i+length-1,i+2*length-1);
	if(i+length-1<=n)
	  Merge(r,i,i+length-1,n);  
}
void MergeSort(LineList r[],int n)
{
	int length;
	for(length=1;length<=n;length=2*length)
	  MergePass(r,length,n); 
}
void OutList(LineList r[],int n)
{
	int i;
	printf("排序后的记录为:");
	for(i=1;i<=n;i++)
	  printf("%5d",r[i]);
}
void MenuSort()
{
	printf("\n                排序子系统");
	printf("\n ===============================================");
	printf("\n                1--更新排序数据");
	printf("\n                2--直接插入排序");
	printf("\n                3--希尔排序");
	printf("\n                4--冒泡排序");
	printf("\n                5--快速排序");
	printf("\n                6--直接选择排序");
	printf("\n                7--堆排序");
	printf("\n                8--归并排序");
	printf("\n                0--返回");
	printf("\n ================================================");
	printf("\n        请输入菜单号=(0-8):");
}
int main()
{
	int i,n;
	LineList r[MAXSIZE];
	char ch1,ch2,a;
	ch1='y';
	while(ch1=='y'||ch1=='Y')
	{
		MenuSort();
		scanf("%c",&ch2);
		getchar();
		switch(ch2)
		{
			case '1':
				printf("请输入待排序表的长度:");
				scanf("%d",&n);
				printf("请输入%d个整数:",n);
				for(i=1;i<=n;i++)
				  scanf("%d",&r[i]);
				OutList(r,n);
				break;
			case '2':
				InsertSort(r,n);
				printf("进行直接插入排序,");
				OutList(r,n);
				break;
			case '3':
				ShellSort(r,n);
				printf("进行希尔插入排序,");
				OutList(r,n);
				break;
			case '4':
				BubbleSort(r,n);
				printf("进行冒泡排序,");
				OutList(r,n);
				break;
			case '5':
				QuickSort(r,1,n);
				printf("进行快速排序,");
				OutList(r,n);
				break;
			case '6':
				SelectSort(r,n);
				printf("进行直接选择排序,");
				OutList(r,n);
				break;
			case '7':
				HeapSort(r,n);
				printf("进行堆排序,");
				OutList(r,n);
				break;
			case '8':
				MergeSort(r,n);
				printf("进行归并排序,");
				OutList(r,n);
				break;
			case '0':
				ch1='n';
				break;
			default:
				printf("输入有误 请输入0-9进行选择!")		;							  
		}
		if(ch2!='0')
		{
			printf("\n按回车键继续 按任意键返回");
			a=getchar();
			if(a!='\xA')
			{
				getchar();ch1='n';
			}
		}
	}

 

posted @ 2026-07-17 13:47  Dr丶云幕  阅读(7)  评论(0)    收藏  举报