排序总结---冒泡排序

//
// Created by liyuanshuo on 2017/3/17.
//

#include "bubble_sort.h"

/*
 *基本思想:
 *
 * 在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较
 * 大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换
 *
 */

void bubble_sort_1( int a[], int n )
{
	for (int i = 0; i < n-1; ++i)
	{
		for (int j = 0; j < n-i-1; ++j)
		{
			if( a[j] > a[j+1] )
			{
				int tmp = a[j];
				a[j] = a[j+1];
				a[j+1] = tmp;
			}
		}
	}
}

/*
 *冒泡排序算法的改进:
 *
 * 对冒泡排序常见的改进方法是加入一标志性变量exchange,用于标志某一趟排序过程中是否有数据交换,如果进行
 * 某一趟排序时并没有进行数据交换,则说明数据已经按要求排列好,可立即结束排序,避免不必要的比较过程。本
 * 代码再提供以下两种改进算法:
 *
 */

//
//1.设置一标志性变量pos,用于记录每趟排序中最后一次进行交换的位置。由于pos位置之后的记录均已交换到位,故
//在进行下一趟排序时只要扫描到pos位置即可。
//

void bubble_sort_2( int r[], int n )
{
	int i = n - 1;
	while ( i > 0 )
	{
		int pos = 0;
		for (int j = 0; j < i; ++j)
		{
			if( r[j] > r[j+1] )
			{
				pos = j;
				int tmp = r[j];
				r[j] = r[j + 1];
				r[j + 1] = tmp;
			}
		}
		i = pos;
	}
}

//2.传统冒泡排序中每一趟排序操作只能找到一个最大值或最小值,我们考虑利用在每趟排序中进行正向和反向两遍
//冒泡的方法一次可以得到两个最终值(最大者和最小者) , 从而使排序趟数几乎减少了一半。

void bubble_sort_3( int r[], int n)
{
	int loww = 0;
	int highh = n - 1;
	int tmp, j;
	while ( loww < highh )
	{
		for ( j=loww ; j<highh ; j++ )
		{
			if( r[j] > r [j+1] )
			{
				tmp = r[j];
				r[j] = r[j+1];
				r[j+1] = tmp;
			}
		}
		--highh;
		for ( j = highh ; j > loww ; --j )
		{
			if( r[j] < r[j-1] )
			{
				tmp = r[j];
				r[j] = r[j-1];
				r[j-1] = tmp;
			}
		}
		++loww;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值