adsort

//ShellSort 希尔排序
void ShellSort(int Data[],int n)
{
    int i,j,gap;
    int temp;
    gap=n/2;
    while(gap>0)
    {
	for(i=gap;i<n;i++)
	{
	    temp=Data[i];
	    j=i-gap;
	    while(j>=0 && temp<Data[j])
	    {
		Data[j+gap]=Data[j];
		j=j-gap;
	    }
	    Data[j+gap]=temp;
	    //j=j-gap;
	}
	gap=gap/2;
    }
}

//QuickSort 快速排序
void QuickSort(int Data[],int low,int high)
{
    if(low<high)
    {
	int i=low,j=high;
	int temp=Data[low];
	while(i!=j)
	{
	    while(j>i && Data[j]>temp)
		j--;
	    if(j>i)
	    {
		Data[i]=Data[j];
		i++;
	    }
	    while(i<j && Data[i]<temp)
		i++;
	    if(i<j)
	    {
		Data[j]=Data[i];
		j--;
	    }
	}
	//now i==j
	Data[i]=temp;
	//data[i] partition the data into two part
	QuickSort(Data,low,i-1);
	QuickSort(Data,i+1,high);
    }
}

//HeapSort 堆排序
void SiftBig(int Data[],int low,int high)
{
    int i=low,j=2*i+1;
    int temp=Data[i];
    while(j<high)
    {
	if(j<high-1 && Data[j]<Data[j+1])
	    j++;//j指两个子结点大的那个
	if(temp<Data[j])
	{
	    Data[i]=Data[j];
	    i=j;//换哪个结点,接下来就调那个结点子树
	    j=2*i+1;
	}
	else
	    break;
    }
    Data[i]=temp;
}
void SiftSmall(int Data[],int low,int high)
{
    int i=low,j=2*i+1;
    int temp=Data[i];
    while(j<high)
    {
	if(j<high-1 && Data[j]>Data[j+1])
	    j++;//j指两个子结点小的那个
	if(temp>Data[j])
	{
	    Data[i]=Data[j];
	    i=j;//换哪个结点,接下来就调那个结点子树
	    j=2*i+1;
	}
	else
	    break;
    }
    Data[i]=temp;
}

void HeapSort(int Data[], int n)
{

    int i,temp;
    for(i=(n-1)/2;i>=0;i--)//调整堆
	SiftSmall(Data,i,n);
    for(i=n-1;i>0;i--)
    {
	temp=Data[0];
	Data[0]=Data[i];
	Data[i]=temp;
	SiftSmall(Data,0,i);
    }
}

//MergeSort 二路归并排序
void Merge(int Data[],int low,int mid,int high)
{
    int *A1;
    int i=low,j=mid+1,k=0;
    A1=(int *)malloc((high-low+1)*sizeof(int));//too frequently, not a good way
    while(i<=mid && j<=high)
	if(Data[i]<Data[j])
	    A1[k++]=Data[i++];
	else
	    A1[k++]=Data[j++];
    while(i<=mid)
	A1[k++]=Data[i++];
    while(j<=high)
	A1[k++]=Data[j++];
    for(k=0,i=low;i<=high;k++,i++)
	Data[i]=A1[k];
    free(A1);//
}
void MergePass(int Data[],int length,int n)
{
    int i;
    for(i=0;i+2*length-1<n;i=i+2*length)
	Merge(Data,i,i+length-1,i+2*length-1);
    if(i+length<n)
	Merge(Data,i,i+length-1,n-1);

}
void MergeSort(int Data[],int n)
{
    int length;
    for(length=1;length<n;length=2*length)
	MergePass(Data,length,n);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值