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

最近看数据结构,把常用的排序算法用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语言版)》  严蔚敏 吴伟民 著  清华大学出版社

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
快速排序算法C语言版) #include <stdio.h> #include "type.h" #define Q_SIZE 10 /************************************* 模块内部数组或变量定义 **************************************/ static UINT8 q_array[Q_SIZE] = {0}; //static UINT8 m_array_tmp[M_SIZE] = {0}; /* 辅助数组,存放排序的中间结果 */ /************************************* 函数定义 **************************************/ /******************************************************************************************* 函数名:UINT8 splt( UINT8 * m_ptr, UINT8 q_low, UINT8 q_high, UINT8 q_pos ) 入口参数列表:m_ptr, q_pos 入口参数描述:数组的地址,数组的首元素和尾元素位置,指向主元位置的指针 返回值描述:无 函数功能:使数组经过排列后小于或等于x的元素在x前面,x在大于它的元素前面(x = q_array[*q_pos]) ********************************************************************************************/ UINT8 splt( UINT8 * q_ptr, SINT8 q_low, SINT8 q_high ) { UINT8 x = 0; SINT8 i = 0; SINT8 j = 0; UINT8 q_tmp = 0; i = q_low; x = q_ptr[q_low]; for (j = q_low + 1; j <= q_high; j++) { if (q_ptr[j] <= x) { i++; if (i != j) { q_tmp = q_ptr[i]; q_ptr[i] = q_ptr[j]; q_ptr[j] = q_tmp; } } } q_tmp = q_ptr[i]; q_ptr[i] = q_ptr[q_low]; q_ptr[q_low] = q_tmp; return i; } /******************************************************************************************* 函数名:void quicksort( UINT8 * m_ptr, UINT8 m_low, UINT8 m_high ) 入口参数列表:m_ptr, m_low, m_high 入口参数描述:数组的地址,数组的首元素和尾元素的索引 返回值描述:无 函数功能:对数组进行排序,产生非降序的数组 ********************************************************************************************/ void quicksort( UINT8 * q_ptr, SINT8 q_low, SINT8 q_high ) { UINT8 q_w; if (q_low < q_high) { q_w = splt(q_ptr, q_low, q_high); quicksort(q_ptr, q_low, q_w - 1); quicksort(q_ptr, q_w + 1, q_high); } } /****************************************************************************** 函数名:main( void ) 入口参数列表:无 入口参数描述:无 返回值描述:无 函数功能:主函数,用于测试 *******************************************************************************/ void main( void ) { UINT8 i, q_num = 0; printf("请输入10个2位整数:\n"); for (i = 0; i < Q_SIZE; i++) { scanf("%d", &q_num); q_array[i] = q_num; } quicksort(q_array, 0, 9); for (i = 0; i < Q_SIZE; i++) { printf("%d ", q_array[i]); } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值