冒泡排序:
/* ================================================ 功能:冒泡排序 输入:数组名称(也就是数组首地址)、数组中元素个数 ================================================ */ /* ==================================================== 算法思想简单描述: 在要排序的一组数中,对当前还未排好序的范围内的全部数,自上 而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较 小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要 求相反时,就将它们互换。 下面是一种改进的冒泡算法,它记录了每一遍扫描后最后下沉数的 位置k,这样可以减少外层循环扫描的次数。 冒泡排序是稳定的。算法时间复杂度O(n2)--[n的平方] ===================================================== */ void bubble_sort(int *x,int n) { int j,k,h,t; for (h=n-1; h>0; h=k) /*循环到没有比较范围*/ { for (j=0,k=0; j<h; j++) /*每次预置k=0,循环扫描后更新k*/ { if (*(x+j) > *(x+j+1)) /*大的放在后面,小的放到前面*/ { t = *(x+j); *(x+j) = *(x+j+1); *(x+j+1) = t; /*完成交换*/ k = j; /*保存最后下沉的位置。这样k后面的都是排序排好了的。*/ } } } }
例:
//利用冒泡排序法对输入的10个整数从小到大排序,显示出每步的排序过程,打印最终结果 //采用一维数组表示这10个数 #include "stdio.h" #define N 10 int main() { int i,j,temp; int a[N+1]; int count = 0;// 记数器,记录是第几趟排序 printf( " Please enter %d date: \n",N ); for (i = 1; i <= N; i++) scanf( " %d",&a[i]); printf( "************************\n"); for (i = 1; i <= N; i++) { count++;//第记录一趟,计数器加1 for ( j=1; j<=N; j++) {//若相邻两数 左边 大于 右边 则交换 if (a[j] > a[j+1]) { temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; } } //打印第几趟和本趟排序结果 printf( "%3d:",count); for (j = 1; j <= N; j++) printf( "%d ",a[j]); printf( " \n "); } //打印最终的排序结果 printf( " The result is :"); for (i = 1; i <= 10; i++); printf( "%d",a[i]); return 0; }
改进后的冒泡排序:
//设置一个标志flag,一旦发现在某趟无需交换数据,即提前跳出循环,终止排序,修改后的程序如下: #include "stdio.h" #define N 10 int main() { int i,temp; int a[N+1]; int count=0; int flag; printf( " Please enter %d date: \n",N ); for( i=1; i<=N; i++) scanf( " %d",&a[i]); printf( "************************\n"); flag=1;//默认整个排序过程有交换 for( i=1; i<=N&&flag; i++) { flag=0; for( j=1; j<=N; j++) { if(a[j]>a[j+1]) { flag=1;//当前趟有交换 temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } if(flag) {//判断是否需打印呢? count++; printf( "%3d:",count); for( j=1; j<=N; j++) printf( "%d ",a[j]); printf( " \n "); } } //打印最终的排序结果 printf( " The result is :"); for( i=1; i<=10; i++); printf( "%d\n",a[i]); return 0; }
编程风格思考:
1、输入、输出的人性化。良好的提示、错误提醒…… 2、方法的可扩展性?自定义数组(数据个数、类型)排序 3、测试用例版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。