码迷,mamicode.com
首页 > 编程语言 > 详细

常用排序算法的C语言实现

时间:2016-05-12 16:17:59      阅读:269      评论:0      收藏:0      [点我收藏+]

标签:

最近看数据结构,把常用的排序算法用C语言写了一下。

没有按数据结构上的定义SqList结构体,只是用数组的形式实现

有的算法并没有完全按书上给出的算法,但思路一致。

#include<stdio.h>
void InsertSort(int[], int);	//直接插入排序 无哨兵
void BInsertSort(int[], int);	//折半插入排序
void BubbleSort(int[], int);	//起泡排序
void QSort(int[], int, int);	//快速排序
void SelectSort(int[], int);	//简单选择排序

int main(){
	//int num[] = {12,23,21,23,123,21,2,221,12,44};
	int num[] = {4,3,6,7,2,13,21,9,8,34};
	//int num[] = {38,65,97,76,13,27,49};  //快排使用
	int i;
	int len = 10;

	//InsertSort(num, len);
	//BInsertSort(num, len);
	//BubbleSort(num, len);	
	//len = 7;
	//QSort(num, 0, len-1);
	//SelectSort(num, len);

	for(i=0; i<len;i++)
	{
		printf("%d ", num[i]);
	}
	printf("\n");
	return 0;
}

//直接插入排序,前i个数保持有序
void InsertSort(int num[], int len)
{	//直接插入排序 无哨兵
	int i,j,temp;
	for(i=1; i<len; i++){
		temp = num[i];
		for(j=i; j>0; j--)
		{
			if(temp < num[j-1]){
				num[j] = num[j-1];
			}else{
				break;
			}
		}
		num[j] = temp;
	}
}

//折半插入排序
void BInsertSort(int num[], int len){
	int i,j,temp,low,high,mid;
	for(i=1; i<len; i++)
	{
		if(num[i] >= num[i-1]) continue;
		temp = num[i];
		low = 0;
		high = i-1;
		mid = (low + high)/2;
		while(low <= high)
		{
			if(num[mid] > temp){
				high = mid - 1;
			}else
			{
				low = mid + 1;
			}
			mid = (low + high)/2;
		}
		//二分查找完成后,low会指向应插入的位置
		for(j=i; j>=low; j--)
		{
			num[j] = num[j-1];
		}
		num[low] = temp;
	}
}

//起泡排序
void BubbleSort(int num[], int len){
	int i, j, temp;
	int change = 1;
	for(i=len; i>0; i--)
	{
		if(change == 0) break;
		change = 0;
		for(j=1; j<i; j++)
		{
			if(num[j-1] > num[j]){
				temp = num[j-1];
				num[j-1] = num[j];
				num[j] = temp;
				change = 1;
			}
		}
	}
}

//快速排序
int Partition(int num[], int low, int high)
{	//一趟快排,返回枢轴位置
	int temp = num[low];
	while(low < high)
	{
		while(low<high && num[high] >= temp) --high;
		num[low] = num[high];
		while(low<high && num[low] <= temp) ++low;
		num[high] = num[low];
	}
	num[low] = temp;
	return low;
}
void QSort(int num[], int low, int high)
{	//递归进行快速排序
	int pivotloc;
	if(low < high){
		pivotloc = Partition(num, low, high);
		QSort(num, low, pivotloc-1);
		QSort(num, pivotloc+1, high);
	}	
}

//简单选择排序
//算法描述:i:0→len; get minValueTag from [i] to [len-1]; [i]<>[minValueTag]; 
void SelectSort(int num[], int len){
	int i, j, minValueTag, temp;
	for(i=0; i<len; i++)
	{
		minValueTag = i;
		for(j=i; j<len; j++)
		{
			if(num[j] < num[minValueTag]){
				minValueTag = j;
			}
		}
		if(minValueTag != i){
			temp = num[i];
			num[i] = num[minValueTag];
			num[minValueTag] = temp;
		}
	}
}
仅供参考,因个人水平及时间有限,文章的错误和不足之处还望指正


参考文献:

        《数据结构(C语言版)》  严蔚敏 吴伟民 著  清华大学出版社

常用排序算法的C语言实现

标签:

原文地址:http://blog.csdn.net/amosilin/article/details/51362170

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!