冒泡排序(及其进阶——鸡尾酒排序)与选择排序的算法思想及具体事例

#include <stdio.h>
#define N  10
/*冒泡排序
(1)比较第一个数与第二个数,若为逆序a[0]>a[1],则交换;
然后比较第二个数与第三个数;依次类推,
直至第n-1个数和第n个数比较为止——第一趟冒泡排序,
结果最大的数被安置在最后一个元素位置上
(2)对前n-1个数进行第二趟冒泡排序,
结果使次大的数被安置在第n-1个元素位置
(3)重复上述过程,共经过n-1趟冒泡排序后,排序结束
*/
int main()
{
	int a[N] = {2,5,8,6,3,4,9,7,0,1};
	int i, j, tmp;
	
	for (i = 0; i < N-1; i++)//控制轮数,每轮都是从a[0]开始往后比较
	{
		for (j = 0; j < N-i-1; j++)//每轮比较次数,选择完后剩下的个数
		{
			if (a[j] > a[j + 1])//第一个数和第二个数比,第二个数和第三个数比
			                    //大的数往后放
			{
				tmp = a[j];
				a[j] = a[j+1];
				a[j+1] = tmp;
			}
		}
	}
	
	for (i = 0; i < N; i++)
	{
		printf ("%d\n", a[i]);
	}

	return 0;
}
/*鸡尾酒排序:将一组树先从左往右两两比较,将较大的数放到后面,最后当前数组中最大的数放在最后(前面数比后面数大则交换两者的位置,其他情况则不变),右边界往左移一位(在数组中最开始右边界为最大下标位置,即最大下标left-1),最大的数看做排除出数组;再从右边界开始(left-1)开始往左找,两两比较,将教小的数放到前面(前面数比后面数大则交换两者的位置,其他情况则不变),最后当前最小的数放在最前面,左边界往右移一位(最开始左边界在0位置,right+1),最小的数看成排除出数组*/
int main() { int a[10] = {9,6,8,0,3,5,2,4,7,1}; int len = sizeof(a) / sizeof(a[0]); int i; int left = 0; int right = len - 1; while (left < right) { // 从左往右找到一个最大的数放到right的位置 for (i = left; i < right; i++) { if (a[i] > a[i+1]) { swap (a, i, i+1); } } right--; // 从右往左找到一个最小的数放到left的位置 for (i = right; i > left; i--) { if (a[i-1] > a[i]) { swap (a, i, i-1); } } left++; } printA (a, len); return 0; }

/*选择排序(1)首先通过n-1次比较,从n个数中找出最小的, 将它与第一个数交换—第一趟选择排序, 结果最小的数被安置在第一个元素位置上(2)再通过n-2次比较,从剩余的n-1个数中找出关键字次小的记录, 将它与第二个数交换—第二趟选择排序(3)重复上述过程,共经过n-1趟排序后,排序结束*//*与冒泡排序共享头文件与宏定义,但一个程序里只能有一个main函数,写一起的话,在main后写上数字(1,2,3,4)已做区分,不让系统预编译*/int main(){int a[N] = {2,5,8,6,3,4,9,7,0,1};int i, j, tmp;for (i = 0; i < N - 1; i++)//控制循环轮数{int index = i;//设最小下标,i的值不能在子循环里改变for (j = i+1; j < N; j++){if (a[j] < a[index])//a[index]代表每轮首个元素{index = j;//找出每轮最小值的下标,让index也代表最小值下标}}if (index != i)//原先index代表每轮首个元素下标,{ //如果在一轮里找到其他最小值的下标,index值改变(同上个注释)tmp = a[i];a[i] = a[index];//a[index]就是每轮最小值,赋值给每轮的第一个元素a[index] = tmp;//}}for (i = 0; i < N; i++){printf ("%d\n", a[i]);}return 0;}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值