冒泡排序法的改进

_Exception_飞 2013-11-18 09:45:56
若给出10个数字,分别为34 66 90 45 100 150 65 92 27 74,用冒泡排序法后可得到正确排序,但其中有些不需要比较,可以直接跳过,该如何处理,希望大神指教!谢谢!
# include<stdio.h>
int main()
{
int a[10];
int i,j,t;
printf("input 10 number:\n");
for(i=0;i<10;i++);
scanf("%d",&a[i]);
printf("\n");
for(j=0;j<9;j++)
for(j=0;j<9-j;i++)
if(a[i]>a[i+1])
{t=a[i];a[i];=a[i+1];a[i+1]=t;}
printf(“the sorted number:\n”);
for(i=0;i<10;i++)
printf(“%d”,a[i]);
printf(“\n”);
return 0;
}

}
...全文
313 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2013-11-19
  • 打赏
  • 举报
回复
引用 4 楼 baichi4141 的回复:
比较之前不知道该不该比较。 比较之后才知道不该比较——有用么? 要真的利用大小的传递关系来优化,那就不是冒泡了,直接快排吧
++ 快排就是冒泡的一种改进,但是这已经不是冒泡了! 要维持冒泡,那么可改进的地方,不是很大.
努力学python 2013-11-19
  • 打赏
  • 举报
回复
加个布尔量,判断一下需不需要交换,。
lm_whales 2013-11-19
  • 打赏
  • 举报
回复
冒泡的可改进处,也就是已经有序,就不再排序了,这么一点可以优化之处。 方法是一轮排序下来,看交换几次,如果完全,没有交换; 自然不要继续排序,就可以结束了。 更好的办法,不知有没有。 原理上是,无逆序,不需要排序!
angel_su 2013-11-19
  • 打赏
  • 举报
回复
1楼给了个思路,可以简单再改良一下用swapped去记录第一次发生交换的地方。内层循环下轮从swapped前一个位置开始。数据量小,部分有序的情况下可能有点效果,数据量大的话还是用其他算法...
baichi4141 2013-11-19
  • 打赏
  • 举报
回复
比较之前不知道该不该比较。 比较之后才知道不该比较——有用么? 要真的利用大小的传递关系来优化,那就不是冒泡了,直接快排吧
_Exception_飞 2013-11-19
  • 打赏
  • 举报
回复
能给我介绍一下鸡尾酒排序吗?
nightkids_008 2013-11-19
  • 打赏
  • 举报
回复
加个flag。。。 还有改良版的 鸡尾酒排序
To_be_sky 2013-11-19
  • 打赏
  • 举报
回复
冒泡就是这样的。比较后,可能不会执行换位。
自信男孩 2013-11-19
  • 打赏
  • 举报
回复
能做到比较但不交换,但做不到不比较。
赵4老师 2013-11-19
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
void better_bubble_sort(int *D, int n) {
    int b,i,m,t;

    b=n-1;
    while (b) {
        m=0;
        for (i=0;i<b;i++) {
            if (D[i]>D[i+1]) {t=D[i];D[i]=D[i+1];D[i+1]=t;m=i;}
        }
        b=m;
    }
}
int main() {
    int d[10],n,i;

    srand(time(NULL));
    for (n=0;n<10;n++) {
        printf("------%d------\n",n);
        for (i=0;i<n;i++) {d[i]=rand()%100;printf(" %02d",d[i]);}
        printf("\n");
        better_bubble_sort(d,n);
        printf("sorted:\n",n);
        for (i=0;i<n;i++) {               ;printf(" %02d",d[i]);}
        printf("\n");
    }
}
//------0------
//
//sorted:
//
//------1------
// 87
//sorted:
// 87
//------2------
// 41 40
//sorted:
// 40 41
//------3------
// 21 03 02
//sorted:
// 02 03 21
//------4------
// 27 03 70 21
//sorted:
// 03 21 27 70
//------5------
// 02 50 57 77 34
//sorted:
// 02 34 50 57 77
//------6------
// 74 94 80 05 58 10
//sorted:
// 05 10 58 74 80 94
//------7------
// 50 43 98 36 90 83 73
//sorted:
// 36 43 50 73 83 90 98
//------8------
// 07 20 21 13 56 90 06 51
//sorted:
// 06 07 13 20 21 51 56 90
//------9------
// 14 94 94 32 14 24 81 32 00
//sorted:
// 00 14 14 24 32 32 81 94 94
//
threenewbee 2013-11-18
  • 打赏
  • 举报
回复
你不遍历怎么知道不需要比较。 只能说比较了,不需要交换。
anthow 2013-11-18
  • 打赏
  • 举报
回复
怎么看到冒泡有点问题了
netbooting 2013-11-18
  • 打赏
  • 举报
回复

#include <stdio.h>

int main(void)
{
    int arr[9];
    int temp, i, j;
    int swapped = 1;

	// 初始化 
    for (i = 0; i <= 9; i++)
        arr[i] = 9 - i;

	// 排序前 
    printf("Before Sort: ");
    for (i = 0; i <= 9; i++)
        printf("%d ", arr[i]);

	// 冒泡排序 
    for (i = 0; swapped; i++) {
        swapped = 0;
        for (j = 0; j < 9 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
                swapped = 1;
            }
        }
    }

	// 排序后 
    printf("\n After Sort: ");
    for (i = 0; i <= 9; i++)
        printf("%d ", arr[i]);
    printf("\n");
    
    return 0;
}

Before Sort: 9 8 7 6 5 4 3 2 1 0
 After Sort: 0 1 2 3 4 5 6 7 8 9

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧