/*
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]。
*/
冒泡排序的改进
最新推荐文章于 2021-06-07 20:11:52 发布