冒泡排序的改进

/*
	Name: BubbleSort 
	Copyright: 
	Author: huowolf 
	Date: 05/07/15 16:18
	Description: 改进的冒泡排序的实现 
*/
#include <iostream>
using namespace std;
#define len 7
int arr[]={48,62,35,77,55,14,35,98};

void BubbleSort(int a[],int length); 
void Output(int a[],int length);

int main()
{
	BubbleSort(arr,len); 
	Output(arr,len);
	return 0;
}

void swap(int &a,int &b)
{
	 a=a^b;
	 b=a^b;
	 a=a^b;
}

void BubbleSort(int a[],int length)
{
	int i,j,lastExchangeIndex;
	i = length;
	while (i >0) // i>0 表明上一趟曾进行过记录的交换
    {      
	    lastExchangeIndex = 1;
	    for (j = 0; j < i; j++){
		    if (a[j+1]<a[j]) 
			{ 
				swap(a[j+1],a[j]);
		        lastExchangeIndex = j;  
		    } 
	     } 
	    i = lastExchangeIndex;	// 一趟排序中无序序列中最后一个记录的位置
	} 
} 

void Output(int a[],int length)
{
	for(int i=0;i<=length;i++)
		cout<<a[i]<<"  "; 
}

/*
冒泡排序的改进基于以下两种思考:
1.
如果上面代码中,里面一层循环在某次扫描中没有执行交换,则说明此时数组已经全部有序列,无需再扫描了。
因此,增加一个标记,每次发生交换,就标记,如果某次循环完没有标记,则说明已经完成排序。

2.
如果R[0..i]已是有序区间,上次的扫描区间是R[i..n],记上次扫描时最后一次执行交换的位置为lastExchangeIndex,
则lastExchangeIndex在i与n之间,不难发现R[i..lastExchangeIndex]区间也是有序的,否则这个区间也会发生交换;
所以下次扫描区间就可以由R[i..n] 缩减到[lastExchangeIndex..n]。 
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值