您的位置:首页 > 编程语言 > C语言/C++

冒泡排序的实现

2016-01-27 13:24 309 查看
/*
作者:秦时小
专业:计算机科学与技术
学校:咸阳师范学院 2013级
时间:2016.01.27

程序名称:冒泡排序算法实现
程序功能:
*/

#include <stdio.h>
#include <stdbool.h>
/*
函数名称:冒泡排序
参数说明:
begin是待排序列的起始地址,end是待排序列最后一个元素的下一地址。
即end刚好且已经越界。compare函数指针。指定排序顺序是升序还是降序
函数说明:
为了避免当待排序列已经有序而程序做无用功浪费时间,在程序里设置了
flag变量,当检测到某一趟没有进行交换数据时,说明已经有序,则不再
进行循环。这样程序最少只执行一次。

*/
void bubbleSort(int* begin,int* end,bool (*compare)(int,int))
{
bool flag=false;
//外循环表示比较的趟数,n个数最大需要执行n-1趟
for(int i=0;i<(end-begin)-1&&!flag;i++)
{
//在每趟循环开始时都把flag置为true,如果flag被改为false,
//则说明未排好序,程序继续。
flag=true;
//内循环控制每一趟相邻两个数的比较,每趟选出一个最大或者最小的数
//放在最后,下一趟则不会再比较最后这个数,因为循环的上线在减少
//j<(end-begin)-i-1;
for(int j=0;j<(end-begin)-i-1;j++)
{

if(!compare(*(begin+j),*(begin+j+1)))
{
flag=false;//表示未排好序
int temp=*(begin+j);
*(begin+j)=*(begin+j+1);
*(begin+j+1)=temp;
}
}
printf("第%d趟\n",i+1);
}
}

//从小到大
bool compareASC(int num1,int num2)
{
return num1<num2;
}

//从大到小
bool compareDESC(int num1,int num2)
{
return num1>num2;
}

int main(void)
{
int arr[]={9,4,7,3,1,5,6,2,8,};
bubbleSort(arr,arr+9,compareASC);//从小到大
//bubbleSort(arr,arr+9,compareDESC);//从大到小
for(int i=0;i<9;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息