【源码】C语言排序算法

  • 时间:
  • 浏览:2532
  • 来源:吧啦熊


引言

C语言各种经典排序法。大学时期刚入坑的时候写的代码,近期整理电脑时发现的,就随手分享了出来,希望对新入坑的童鞋有点作用。


#include<stdio.h>


void BubbleSort(int *Array,int n);//冒泡排序法
void BubleSort_ch1(int *Array,int n);//改进后的冒泡排序法
void BubleSort_ch2(int *Array,int n);//改进的冒泡排序法

void QuickSort(int *Array,int n);//快捷排序法

void SelectSort(int *Array,int n);//直接选择排序法
void InsertSort(int *Array,int n);//直接插入法

void ShellSort(int *Array,int n);//希尔排序法

void HeapSort(int *Array,int n);//堆排序法 

void MergeSort(int *Array,int n);//归并排序法

void Restore(int *Array,int i,int n)//重建堆
{
	int j,k,r;
	int done=0;
	k=r=*(Array+i);
	j=2*i;
	while(j<=n&&done==0)
	{
		if(j<n)
		{
			if(*(Array+j)<*(Array+j+1))
				j++;
		}
		if(k>=*(Array+j))
		{
			done=1;
		}
		else
		{
			*(Array+j/2)=*(Array+j);
			j*=2;
		}
	}
	*(Array+j/2)=r;
}


void HeapSort(int *Array,int n)
{
	Array--;//该算法数组第一个位置无效。
	int i,j,t;
	for(i=n/2;i>0;i--)
		Restore(Array,i,n);
	for(i=n-1;i>0;i--)
	{
		t=*(Array+i+1);
		*(Array+i+1)=*(Array+1);
		*(Array+1)=t;
		Restore(Array,1,i);
	}	
}

void InsertSort(int *Array,int n)//直接插入法
{
	int i,j,temp;
	for(i=1;i<n;i++)
	{
		if(*(Array+i)<*(Array+i-1))
		{
			temp=*(Array+i);
			j=i-1;
			do
			{
				*(Array+j+1)=*(Array+j);
				j--;
			}while(j>=0&&temp<*(Array+j));
			*(Array+j+1)=temp;	
		}
		
	}
}

void MergePass(int *a,int *b,int t,int n)
{
	int i,j,index;
	int beg1,end1;
	int beg2,end2;
	beg1=0;
	index=0;
	while(beg1+t<=n-1)
	{
		beg2=beg1+t;
		end1=beg2-1;
		if(beg2+t-1<=n-1)
			end2=beg2+t-1;
		else
			end2=n-1;
		i=beg1;
		j=beg2;
		while(i<=end1&&j<=end2)
		{
			if(*(a+i)<*(a+j))
			{
				*(b+index)=*(a+i);
				i++;
				index++;
			}
			else
			{
				*(b+index)=*(a+j);
				j++;
				index++;
			}
		}
		while(i<=end1)
		{
			*(b+index)=*(a+i);
			index++;
			i++;
		}
		while(j<=end2)
		{
			*(b+index)=*(a+j);
			index++;
			j++;
		}
		beg1=end2+1;
	}
	for(i=beg1;i<n;i++,index++)
	{
		*(b+index)=*(a+i);
	}
}

void MergeSort(int *Array,int n)
{
	int *array=new int[n];
	int i,j;
	j=1;
	while(j<n)
	{
		MergePass(Array,array,j,n);
		for(i=0;i<n;i++)
			*(Array+i)=*(array+i);
		j*=2;
	}
	delete array;

}

//i 数组左边界
//j 数组右边界
int Partition(int *Array,int i,int j)
{
	int t=*(Array+i);
    while(i<j)
	{
		while(i<j&&*(Array+j)>=t)
			j--;
		if(i<j)
		{
			*(Array+i)=*(Array+j);
			i++;
		}
		while(i<j&&*(Array+i)<=t)
			i++;
		if(i<j)
		{
			*(Array+j)=*(Array+i);
			j--;
		}
	}
	*(Array+i)=t;
	return i;
}


void ToQuickSort(int *Array,int low,int high)
{
	int mid;
	if(low<high)
	{
		mid=Partition(Array,low,high);
		ToQuickSort(Array,low,mid-1);
		ToQuickSort(Array,mid+1,high);
	}
}
void QuickSort(int *Array,int n)
{
	ToQuickSort(Array,0,n-1);
}

void SelectSort(int *Array,int n)//直接选择排序法
{
	int i,j,m,a;
	for(i=0;i<n-1;i++)
	{
		m=i;
		for(j=i+1;j<n;j++)//从无序序列中找出具有最小值的位置
		{
			if(*(Array+j)<*(Array+m))
				m=j;
		}
		if(m!=i)
		{
			a=*(Array+m);
			*(Array+m)=*(Array+i);
			*(Array+i)=a;

		}
	}
}

void ShellInsert(int *Array,int step,int n)
{
	int i,j,rec;
	for(i=1+step;i<n;i++)
	{
		if(*(Array+i)<*(Array+i-step))
		{
			j=i-step;
			rec=*(Array+i);
			do
			{
				*(Array+j+step)=*(Array+j);
				j-=step;
			}while(j>=0&&rec<*(Array+j));
			*(Array+j+step)=rec;

		}
	}
}

void ShellSort(int *Array,int n)
{
	int addition=n;
	do
	{
		addition=addition/3;
		ShellInsert(Array,addition,n); 
	}while(addition>0);
}


void main()
{
	int array[9]={5,9,2,16,10,4,12,15,8};

	int i;
	printf("排序前:");
	for(i=0;i<9;i++)
		printf("%d ",array[i]);
	 //BubbleSort(array,8);  //冒泡排序法
	 //BubleSort_ch1(array,8);  //改进冒泡排序
     //BubleSort_ch2(array,8);  //改进冒泡排序
     //QuickSort(array,9);
     // SelectSort(array,9);
     //InsertSort(array,9);//直接插入发
	 //ShellSort(array,9);
	 //HeapSort(array,9);
	MergeSort(array,9);
    printf("\n排序后:");
	for(i=0;i<9;i++)
		printf("%d ",array[i]);
	 printf("\n");

}void InsertSort(int *Array,int n)//直接插入法
{
	int i,j,temp;
	for(i=1;i<n;i++)
	{
		if(*(Array+i)<*(Array+i-1))
		{
			temp=*(Array+i);
			j=i-1;
			do
			{
				*(Array+j+1)=*(Array+j);
				j--;
			}while(j>=0&&temp<*(Array+j));
			*(Array+j+1)=temp;	
		}
		
	}
}void MergePass(int *a,int *b,int t,int n)
{
	int i,j,index;
	int beg1,end1;
	int beg2,end2;
	beg1=0;
	index=0;
	while(beg1+t<=n-1)
	{
		beg2=beg1+t;
		end1=beg2-1;
		if(beg2+t-1<=n-1)
			end2=beg2+t-1;
		else
			end2=n-1;
		i=beg1;
		j=beg2;
		while(i<=end1&&j<=end2)
		{
			if(*(a+i)<*(a+j))
			{
				*(b+index)=*(a+i);
				i++;
				index++;
			}
			else
			{
				*(b+index)=*(a+j);
				j++;
				index++;
			}
		}
		while(i<=end1)
		{
			*(b+index)=*(a+i);
			index++;
			i++;
		}
		while(j<=end2)
		{
			*(b+index)=*(a+j);
			index++;
			j++;
		}
		beg1=end2+1;
	}
	for(i=beg1;i<n;i++,index++)
	{
		*(b+index)=*(a+i);
	}
}

void MergeSort(int *Array,int n)
{
	int *array=new int[n];
	int i,j;
	j=1;
	while(j<n)
	{
		MergePass(Array,array,j,n);
		for(i=0;i<n;i++)
			*(Array+i)=*(array+i);
		j*=2;
	}
	delete array;

}void SelectSort(int *Array,int n)//直接选择排序法
{
	int i,j,m,a;
	for(i=0;i<n-1;i++)
	{
		m=i;
		for(j=i+1;j<n;j++)//从无序序列中找出具有最小值的位置
		{
			if(*(Array+j)<*(Array+m))
				m=j;
		}
		if(m!=i)
		{
			a=*(Array+m);
			*(Array+m)=*(Array+i);
			*(Array+i)=a;

		}
	}
}void ShellInsert(int *Array,int step,int n)
{
	int i,j,rec;
	for(i=1+step;i<n;i++)
	{
		if(*(Array+i)<*(Array+i-step))
		{
			j=i-step;
			rec=*(Array+i);
			do
			{
				*(Array+j+step)=*(Array+j);
				j-=step;
			}while(j>=0&&rec<*(Array+j));
			*(Array+j+step)=rec;

		}
	}
}

void ShellSort(int *Array,int n)
{
	int addition=n;
	do
	{
		addition=addition/3;
		ShellInsert(Array,addition,n); 
	}while(addition>0);
}

 


猜你喜欢

【技术】state-machine状态机设计模式在项目中的应用

状态机的定义状态机是一种用来进行对象建模的工具,它是一个有向图形,由一组节点和一组相应的转移函数组成。状态机通过响应一系列事件而“运行”。每个事件都在属于“当前”节点的转移函数

2020-05-21

CentOS 7.x下使用yum安装MySQL5.6

CentOS 7.x下使用yum安装MySQL5.6

2020-04-16

不破不立,继续前行

2019,不破不立,继续前行。

2018-12-24

【大结局】人不彪悍枉少年:青春略有遗憾才更值得回味

网剧《人不彪悍枉少年》迎来了大结局。和小编预想的不同,无论是杨夕、花彪还是黄澄澄和李渔,没有一对最终在一起。花彪因奶奶患上老年痴呆,选择在奶奶彻底记忆不清前带奶奶环游世界。杨夕

2018-12-21

清华学霸情侣马艺妮和宋思睿,被爆学术造假,死缠烂打约3p

清华大学的特将候选人,还参加过最强大脑的清华校花马艺妮和男友宋思睿,两人死缠烂打约北京大学妹子3p被曝光。马艺妮曾在《最强大脑》节目中,说自己遇到了现实版的“肖奈”。不久前,北

2018-12-05