排序的基本代码

插入排序

void Insert_Sort(int a[],int n)
{
	int i,j;
	for(i=1;i<n;i++)
	{
		int temp=a[i];
		j=i-1;
		while(j>=0&&a[j]>temp)
		{
			a[j+1]=a[j];
			j--;
		}
		a[j+1]=temp;
	}
}

折半插入排序

void BInsert_Sort(int *a,int n)
{
	int i,j,low,high,mid,key;
	for(i=1;i<n;i++)
	{
		key=a[i];
		low=0;
		high=i-1;
		while(low<=high){
			mid=(low+high)/2;
			if(a[mid]>key)
				high=mid-1; //查左半子表
			else
				low=mid+1;//查右半子表
		}
		for(j=i-1;j>=high+1;j--)
			a[j+1]=a[j];
		a[high+1]=key;

	}
}

希尔排序

void Shell_Sort(int *a,int n)
{
	int i,j,front,gap,temp;
	for(gap=n/2;gap>=1;gap=gap/2)  //每轮步长减半
		for(i=0;i<gap;i++)  //每次分组的第一个元素下标
			for(j=i+gap;j<n;j=j+gap)  //对步长为gap的元素进行直接插入排序
			{
				front=j-gap;  //比较元素的前一个元素
				temp=a[j];
				while(front>=0&&a[front]>temp)
				{
					a[front+gap]=a[front];
					front=front-gap;  //向前比较
				}
				a[front+gap]=temp;

			}

}

冒泡排序

void Bubble_Sort(int *a,int n)
{
	int i,temp;
	for(i=0;i<n-1;i++)  //排序趟数
	{
		int j;
		int flag=0;
		for(j=0;j<n-1-i;j++)
		{
			if(a[j]>a[j+1])  //升序排序
			{
				temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;
				flag=1;
			}
		}
		if(flag==0)  //这一躺没有交换元素,则代表已经有序
		{
			return;
		}
	}
}

快速排序

void Quick_Sort(int *a,int low,int high)
{
	if(low<high)  //递归跳出条件
	{
		int i=low;
		int j=high;
		int key=a[i];
		while(i<j)
		{
		    while(i<j&&a[i]<=key) //在左边找比关键字大的数,如果小于关键字就右移
			{
				i++;
			}
			while(i<j&&a[j]>=key) //在右边找比关键字小的数,如果大于关键字就左移
			{
				j--;
			}
			if(i<j)
			{
			int temp=a[i];
			a[i]=a[j];
			a[j]=temp;
			}
		}
		int temp=a[j];
		a[j]=a[low];
		a[low]=temp;
		Quick_Sort(a,low,j-1);
		Quick_Sort(a,j+1,high);
	}
}

选择排序

void Select_Sort(int *a,int n)
{
	int i,j,min,temp;
	for(i=0;i<n-1;i++) //一共进行n-1趟
	{
		min=i;
		for(j=i+1;j<n;j++)
			if(a[j]<a[min])min=j;
		if(min!=i)
		{
			temp=a[i];
			a[i]=a[min];
			a[min]=temp;
		}
	}
}

堆排序

void HeadAdjust(int *a,int k,int n) //将元素k为根的子树进行调整
{
	int key=a[k];
	int i;
	for(i=2*k;i<n;i=i*2)
	{
		if(i<n&&a[i]<a[i+1])
			i++; //找左右子树中大的那个坐标为i
		if(key>=a[i])break;
		else
		{
			a[k]=a[i];
			k=i;
		}
	}
	a[k]=key;
}

void BuildMaxHeap(int *a,int n)//构建大根堆
{
	for(int i=n/2;i>=0;i--)
		HeadAdjust(a,i,n);
}

void HeapSort(int *a,int n)//完整堆排序算法
{
	BuildMaxHeap(a,n);
	for(int i=n-1;i>0;i--)
	{
		int temp=a[i];
		a[i]=a[0];
		a[0]=temp;
		HeadAdjust(a,0,i-1);
	}

}

合并排序

#include <stdlib.h>
void Merge(int *a,int low,int mid,int high)//将前后相邻的两个有序表归并为一个有序表
{
	int *b=(int *)malloc(n*sizeof(int));
	int i,j,k;
	for(i=low;i<=high;i++)
		b[i]=a[i];
	for(i=low,j=mid+1,k=low;i<=mid&&j<=high;k++)
	{
		if(b[i]<=b[j])
			a[k]=b[i++];
		else
			a[k]=b[j++];

	}
	while(i<=mid)a[k++]=b[i++];
	while(j<=high)a[k++]=b[j++];
}
void Merge_Sort(int *a,int low,int high)
{
	if(low<high){
	  int mid=(low+high)/2;
	  Merge_Sort(a,low,mid);
	  Merge_Sort(a,mid+1,high);
	  Merge(a,low,mid,high);
	}
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值