数据结构中的排序——C语言实现排序源代码

#include<stdio.h>
#include<stdlib.h>

void Print(int a[], int n);
void Swap (int *a, int *b);

int main()
{
	int a[20] = {21,23,53,32,54,30,65,43,13,35,24,95,65,67,45,87,37,22,100,64};
	
	Print(a, 20);
	
	BubbleSort(a, 20);
	InsertSort1(a, 20);
	SimpleSelectSort(a,20);
	ShellSort(a, 20);
	QuickSort(a, 20);
	printf("\n排序结果:\n");
	Print(a, 20);
	return 0;
}
void Print(int a[], int n)//数组输出函数。便于调试
{
	for(int i = 0; i < n; i++)
		printf("%4d", a[i]);
}
void Swap (int *a, int *b)
{	
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}


 

冒泡排序:

/************************冒泡排序法***********************/
void BubbleSort(int a[],int n)
{
	for(int i = 0; i < n; i++)
		for(int j = 1; j < n - i ; j++)
			{
				if(a[j] > a[j-1])
					Swap(&a[j], &a[j-1]);
			}
}


 

简单选择排序:

/***************简单选择排序******************************/
void SimpleSelectSort(int a[],int n)
{	
	int min;

	for(int i = 0; i < n; i++)
	{
		min = i;
		for(int j = i + 1 ; j < n; j++)
		{
			if(a[j] > a[min])
				min = j;
		}
		if(min != i)
			Swap(&a[min], &a[i]);
	}
}


 

直接插入排序:

void InsertSort1(int a[], int n)
{	
	int i, j;

	for( i = 1; i < n; ++i)
	{
		for(j = i-1; j >= 0; --j)
			{
		    	if(a[j] < a[i])
			    	break;
			}
		if(j != i - 1)
			{
				int temp = a[i];
				for(int k = i-1;k > j; --k)
						a[k+1] = a[k];
				a[k+1] = temp;
			}
	}
}


 

希尔排序:

void ShellSort(int a[], int n)
{
	int i, j, step;
	for(step = n/2; step > 0; step/=2)
	{
		for(i = 0; i < step; i++)
		{
			for(j = i+step; j < n; j += step)
			{
				if(a[j] < a[j-step])
				{
					int temp = a[j];
					int k = j - step;
					while( k >= 0 && a[k] > temp)
					{
						a[k + step] = a[k];
						k = k - step;
					}
					a[k + step] = temp;
				}		
			}		
		}	
	}
}


 

归并排序:

/*******************归并排序开始*************************/
void MergeSort(int a[], int n)
{
	int *b = (int*)malloc(sizeof(int));
	MergeSortAssist(a, b, 0, n-1);

	for(int i = 0; i < n; i++)
		a[i] = b[i];
	free(b);
}
void MergeSortAssist(int a[], int b[], int first,int last)
{	
	
	while(first < last)
		{
		    int mid = (last + first)/2;
			MergeSortAssist(a, b, first, mid);
			MergeSortAssist(a, b, mid + 1, last);
			MergeSortMsort(a, b, first, mid, last);
		}
}
void MergeSortMsort(int a[], int b[], int first, int mid, int last)
{
	int i = first;
	int j = mid + 1;
	int k = 0;
	while( i <= mid && j <= last)
	{
		if(a[i] <= a[j])
			b[k++] = a[i++];
		  else
			b[k++] = a[j++];
	
	}
	while( j<= last)
		b[k++] = a[j++];
	while( i <= mid)
		b[k++] = a[i++];
	for(int l = first; l < k; l++)
		a[first + l] = b[l];
}
/*****************归并排序结束*********************/


 

快速排序:

/*******************快速排序开始***********************/
void QuickSort(int a[], int n)
{
	
	Qsort(a, 0, n-1);

}
void Qsort(int a[], int low, int high)
{
	int pivot;
	
	if( low < high)
	{
		pivot = Partition(a, low, high);
		Qsort(a, low, pivot-1);
		Qsort(a, pivot + 1, high);
	}
}
int Partition(int a[], int low, int high)
{
	int i = low, j = high;
	int temp = a[low];

	while(i < j)
	{
		while(i < j && a[j] >= temp)
			j--;
		if(i < j)
		{
			a[i] = a[j];
			i++;
		}
		while(i < j && a[i] < temp)
			i++;
		if(i < j)
		{
			a[j] = a[i];
			j--;
		}
	}
	a[i] = temp;
	return i;
}
/*******************快速排序结束*************************/


 参考: 1 大话数据结构

             2 http://blog.csdn.net/column/details/algorithm-easyword.html

 

1、冒泡排序属于稳定排序,是一种借助“交换”进行排序的方法。首先要将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则将两个记录交换之,然后比较第二个记录与第三个记录的关键字,以此类推,直至第n-1个记录与第n个记录的关键字进行比较为止,这一过程称为第一趟冒泡排序,其结果使得关键字最大的记录被安置在最后一个记录的位置上;然后进行第二趟冒泡排序,对前N-1个记录进行同样操作;以此类推,直到在一趟排序过程没有进行过交换记录的操作为止。 2、直接插入排序属于稳定的排序,每次从无序表取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。第一趟将待比较的数值与它的前一个数值进行比较,当前一数值比待比较数值大的情况下继续循环比较,依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程,结束该次循环。 3、快速排序属于不稳定排序,是对起泡排序的一种改进。它的基本思想是,通过一趟排序将待排记录分割成独立的两部分,其一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。假设待排序的序列为{R.[s],R.[s+1],…….,R.[t]},首先任意选取一个记录,然后按下述原则从新排序记录:将关键字较他小的记录都安置在他的位置之前,将所有关键字较他大的记录都安置在他的位置后面。由此可以该“枢轴”记录最后所落的位置i作为分界线,将序列{R[s],R[s+1]…….R[t]}分割成两个子序列{R[s],R[s+1]…..R[i-1]}和{R[i+1]……R[t]},这个过程称作一趟快速排序。一趟快速排序的具体做法是:附设两个指针low和high,它们的初值分别指向数组第一个数据和最后一个数据,将枢轴记录暂存在R[0]的位置上排序过程只作R[low]或R[high]的单向移动,直至一趟排序结束后再将枢轴记录移至正确位置上。 4、简单选择排序属于不稳定排序,基本思想是,每一趟在n-i+1(i=1,2,…n-1)个记录选取关键字最小的记录作为有序序列第i个记录。第i趟简单选择排序是指通过n-i次关键字的比较,从n-i+1个记录选出关键字最小的记录,并和第i个记录进行交换。共需进行n-1趟比较,直到所有记录排序完成为止。例如:进行第i趟选择时,从当前候选记录选出关键字最小的k号记录,并和第i个记录进行交换。 5、希尔排序属于不稳定排序,也是一种属插入排序类,它的基本思想是:先将整个待排记录序列分割称为若干个子序列分别进行直接插入排序,待整个序列记录“基本有序”时,再对全体记录进行一次直接插入排序。希尔排序的一个特点是:子序列的构成不是简单的“逐段分割”,而是将相隔某个“增量”的记录组成一个子序列。 6、堆排序属于不稳定排序,它的基本思想是,先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区,再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换,由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key;由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆,然后再次将R[1..n-1]关键字最大的记录R[1]和该区间的最后一个记录R[n-1]交换,由此得到新的无序区R[1..n-2]和有序区R[n-1..n],且仍满足关系R[1..n- 2].keys≤R[n-1..n].keys,同样要将R[1..n-2]调整为堆。直到无序区只有一个元素为止。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值