冒泡排序、快速排序、选择排序

C语言下:冒泡排序、快速排序、选择排序一览

本人菜鸟一枚,对于C语言下一些简单排序,平时想到,总会摸棱两可,不能立即理清思路,故今天将冒泡、快速、选择排序重新梳理一遍,并借鉴他人的原理表述发布出来,以便日后时常提醒。若有什么不足的地方,还望指教!!!

冒泡排序

冒泡排序的基本思想是:每次比较两个相邻的元素,如果他们的顺序错误就把他们交换过来。

void Bubble_sort(int *arr,int num)
{
	for(int i=0; i<num-1; i++)
	{
		for(int j=0; j<num-i-1; j++)
		{
			if(arr[j]>arr[j+1])//升序排序
			{
				int tmp = arr[j+1];
				arr[j+1] = arr[j];
				arr[j] = tmp;
			}
		}
	}
}

快速排序

快速排序的基本思想:
(1)先从数列中选择一个数作为基准数
(2)将序列分成两个区间,小于步骤(1)基准数的放在左区间,大于基准数的放在右区间。
(3)对步骤(2)分出的左右区间重复第二步,直到各区间只有一个数。(递归)

void Quick_sort(int *a,int left,int right)
{
	int i,j,tmp;
	if(left>right)
	 return;
	tmp = a[left];//将基准数存入tmp中
	i=left;
	j=right;
	while(i != j)
	{
		while(a[j]>=tmp && i<j)//先从右边开始找
			j--;
		while(a[i]<=tmp && i<j)//再找左边的
			i++;
		//交换两个数在数组中的位置
		if(i<j)
		{
			int t = a[i];
			a[i] = a[j];
			a[j] = t;
		}
	}
	//最终将基准数归位
	a[left] = a[i];
	a[i] = tmp;
	
	Quick_sort(a,left,i-1);//递归地处理左边区间
	Quick_sort(a,i+1,right);//递归地处理右边区间
}
 

选择排序

直接选择排序,这是一种简单直观的排序算法。它首先在未排序序列中找到最小(大)元素,存放到排序序列的其起始位置,然后再从剩余未排序的序列元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素排序完毕。

void Select_sort(int *a, int num)
{
	int i,j,tmp;
	printf("Select_sort: ");
	for(i=0; i<num; i++)
	{
		for(j=i+1; j<num; j++)
		{
			if(a[i] > a[j])
			{
				tmp = a[i];
				a[i] = a[j];
				a[j] = tmp;
			}
		}
		printf("%d ",a[i]);
	}
	printf("\n");
}

完整代码

#include <stdio.h>
#include <assert.h>

#define QSORT_NUM 10 //快速排序的数组元素个数

void Bubble_sort(int *arr,int num)
{
	for(int i=0; i<num-1; i++)
	{
		for(int j=0; j<num-i-1; j++)
		{
			if(arr[j]>arr[j+1])//升序排序
			{
				int tmp = arr[j+1];
				arr[j+1] = arr[j];
				arr[j] = tmp;
			}
		}
	}
}
 

void Quick_sort(int *a,int left,int right)
{
	int i,j,tmp;
	if(left>right)
	 return;
	tmp = a[left];//将基准数存入tmp中
	i=left;
	j=right;
	while(i != j)
	{
		while(a[j]>=tmp && i<j)//先从右边开始找
			j--;
		while(a[i]<=tmp && i<j)//再找左边的
			i++;
		//交换两个数在数组中的位置
		if(i<j)
		{
			int t = a[i];
			a[i] = a[j];
			a[j] = t;
		}
	}
	//最终将基准数归位
	a[left] = a[i];
	a[i] = tmp;
	
	Quick_sort(a,left,i-1);//递归地处理左边区间
	Quick_sort(a,i+1,right);//递归地处理右边区间
}
 

void Select_sort(int *a, int num)
{
	int i,j,tmp;
	printf("Select_sort: ");
	for(i=0; i<num; i++)
	{
		for(j=i+1; j<num; j++)
		{
			if(a[i] > a[j])
			{
				tmp = a[i];
				a[i] = a[j];
				a[j] = tmp;
			}
		}
		printf("%d ",a[i]);
	}
	printf("\n");
}

int main()
{
	int buf[10]={10,52,3,54,6,12,73,69,81,26};
	Bubble_sort(buf,10);
	printf("Bubble_sort: ");
	for(int i=0; i<10; i++)
	{
		printf("%d ",buf[i]);
	}
	printf("\n");
	
	int buf2[QSORT_NUM]={10,52,3,54,6,12,73,69,81,26};
	Quick_sort(buf2,0,QSORT_NUM-1);
	printf("Quick_sort: ");
	for(int i=0; i<QSORT_NUM; i++)
	{
		printf("%d ",buf2[i]);
	}
	printf("\n");
	
	Select_sort(buf, 10);
	
	return 0;
}

发布了4 篇原创文章 · 获赞 7 · 访问量 1194
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览