排序算法

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
冒泡
void exchange(char *a,char *b)
{
	char temp;
	temp=*a;
	*a=*b;
	*b=temp;
}
void printarray(char n[], int len)
{
	int i;
	printf("output:");
	for(i=0;i<len;i++)
		printf("%c ",n[i]);
	printf("\n");
}
void bubblesort(char n[],char len)
{
	int i,j;
	for(i=0;i<len-1;i++)
		for(j=0;j<len-i-1;j++)
		{
			if(n[j]>n[j+1])
				exchange(&n[j],&n[j+1]);
		}
}
/插入
void insertsort(char n[],int len)
{
	int i,j,t;
	char temp;
	for(i=0;i<len;i++)
		for(j=0;j<i;j++)
		{
			if(n[j]>n[i])
			{
				temp=n[i];
				for(t=i;t>j;t--)
					n[t]=n[t-1];
				n[j]=temp;
			}
		}

}
///归并
void merge(char n[],int left,int right,int mid)//下标mid的元素属于前一个数组
{
	int i=left,j=mid+1,tempindex=0,nindex=left;//nindex=left易错
	char *temp=(char *)malloc(right-left+1);
	while(i<=mid&&j<=right)//right不是left
	{
		if(n[i]>n[j])
		{
			temp[tempindex++]=n[j++];
		}
		else
		{
			temp[tempindex++]=n[i++];
		}
	}
	while(i<=mid&&j>right)
	{
		temp[tempindex++]=n[i++];
	}
	while(i>mid&&j<=right)
	{
		temp[tempindex++]=n[j++];
	}
	tempindex=0;
	while(nindex<=right)
	{
		n[nindex++]=temp[tempindex++];
	}
	free(temp);//记得释放
}

void mergesort(char n[],int left,int right)
{
	if(left==right)
	{
		return;
	}
	mergesort(n,left,left+(right-left)/2);
	mergesort(n,left+(right-left)/2+1,right);
	merge(n,left,right,left+(right-left)/2);
}
///堆排序
int findparent(i)
{
	return (i-1)/2;
}
int findleft(int i)
{
	return 2*i+1;//乘号
}
int findright(int i)
{
	return 2*i+2;
}
void heap_max(char n[],int index,int len)//heap基本操作 将一个新元素插入
{
	int temp,left,right;
	left=findleft(index);
	right=findright(index);
	if(left<len&&n[index]<n[left])
	{
		temp=n[index];
		n[index]=n[left];
		n[left]=temp;
		heap_max(n,left,len);
		
	}
	if(right<len&&n[index]<n[right])
	{
		temp=n[index];
		n[index]=n[right];
		n[right]=temp;
		heap_max(n,right,len);
	}
}

void build_heap(char n[],int len)
{
	int index;
	for(index=len-1;index>=0;index--)
	{
		heap_max(n,index,len);
	}
}

void heap_sort(char n[],int len)
{
	if(len>1)
	{
		int temp;
		build_heap(n,len);
		temp=n[0];
		n[0]=n[len-1];
		n[len-1]=temp;
		len--;
		heap_sort(n,len);
	}
}
///快速排序
void quick_sort(char n[], int len)
{
	if(len>1)
	{
		int i=0,j=0;
		for(j=0;j<len-1;j++)
		{
			if(n[j]<n[len-1])
			{
				exchange(&n[i],&n[j]);
				i++;
			}
		}
		exchange(&n[i],&n[len-1]);//记得加取地址
		quick_sort(n,i);
		quick_sort(n+i+1,len-1-i);
	}
}
///
void main()
{
	char n[100];
	int len;
	memset(n,0,sizeof(n[0])*100);
	while(1)
	{
		printf("input array(不超过99个字符+回车):");
		if(fgets(n,100,stdin)==NULL)//换行符也要读进来
			printf("fgets error\n");
		len=strlen(n);
		//int len=sizeof(n)/sizeof(n[0]);
		//bubblesort(n,len);
		//insertsort(n,len);
		if(len>0)
		{
			//mergesort(n,0,len-1);
			heap_sort(n,len);
			//quick_sort(n,len);
			//printarray(n,len);
			fputs("output:",stdout);//输出不带'\0'
			fputs(n,stdout);
			fputs("\n",stdout);
		}
		else
			printf("arraysize ==0!\n");
		memset(n,0,sizeof(n[0])*100);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值