2 iseuwei ISEUWEI 于 2016.04.03 16:48 提问

c语言中的冒泡排序算法

直接上代码,图:
#include
#include
#include
typedef struct{
int*pt;
int cur;
int len;
}intArr;
void bubblesort(intArr*ia){
int i,j,t,n=ia->cur;
for(i=n;i>2;i--)
for(j=1;j if(ia->pt[j]>ia->pt[j-1]){
t=ia->pt[j-1];
ia->pt[j-1]=ia->pt[j];
ia->pt[j]=t;
}
}
void printarray(intArr*ia){
int n=ia->cur;
while(n>0)
printf("%d\t",ia->pt[--n]);
printf("\n");
}
void insertarray(intArr*ia,int t){
if(ia->cur>=ia->len)
ia->pt=(int*)realloc(ia,ia->len+=10);
if(ia->pt)
ia->pt[ia->cur++]=t;
bubblesort(ia);
printarray(ia);
}
int main(){
intArr ia,iA;
int i;
ia=&iA;
ia->pt=(int
)calloc(10,sizeof(int));
ia->cur=0,ia->len=10;
printf("输入待排序数列,以空格间隔,以0结尾\n");
scanf("%d",&i);
while(i!=0)
insertarray(ia,i),
scanf("%d",&i);
system("pause");
return 0;
}
上面是完整代码,下面截图:
图片说明
图片说明
图片说明
最后一张是测试结果,可以看到在中间的某些排序中,最后两位总是错位,而且,在bubblesort()排序算法中,if()里面的>也让我很费解,按理应该降序,实际却是升序,求助大神解答

7个回答

qq_24941111
qq_24941111   2016.04.04 13:39
已采纳

你的程序里排序时是按照大数存到低地址,小数存到高地址,输出时是先输出高地址,后输出低地址,所以输出的数是升序。而有错位是因为输出的格式是一个“%d\t”,未给定数值的位宽。即456占三个字符,而78是两个字符。

ISEUWEI
ISEUWEI 哦,已经解决了,原来是i>2的问题,等于是前两个数少比较一次,还是你改正后的i>1正确,看来输出时倒序坑人哪
2 年多之前 回复
ISEUWEI
ISEUWEI 额,说反了,输入时最后一位小于倒数第二位
2 年多之前 回复
ISEUWEI
ISEUWEI 很感谢,点出了输出时逆序输出的问题,我自己都忘记这点了,我看到你修改了三处,3d i>1 free(),很严谨。其中我说的末尾两位错位,不是那个意思,那张图恰好避开了,没表现出来,真实情况是 比如输入12 45 36 24 56 0 结果可能是45 36 24 12 56就是说排序时似乎少把最后一个数算进去,当然最后一个数必须大于倒数第二个数才成立,能加好友吗?回复我
2 年多之前 回复
CSDNXIAOC
CSDNXIAOC   2016.04.03 16:52

结果: 代码:#include <stdio.h>void main()
{
int i, j, temp;
int a[10];

for (j = 0; j < 9; j++)
{
for (i = 0; i < 9 - j; i++)
{
if (a[i] > a[i + 1])
{
......
答案就在这里:c语言冒泡排序算法
----------------------你好,人类,我是来自CSDN星球的问答机器人小C,以上是依据我对问题的理解给出的答案,如果解决了你的问题,望采纳。

devmiao
devmiao   Ds   Rxr 2016.04.03 22:48
qq_24941111
qq_24941111   2016.04.04 13:34

图片说明
你是想要这种效果吗?

qq_24941111
qq_24941111   2016.04.04 13:42

修改代码如下,可得到上面的效果。

 #include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef struct{
    int *pt;
    int cur;
    int len;
}intArr;
void bubblesort(intArr *ia){
    int i,j,t,n=ia->cur;
    for(i=n;i>1;i--)
        for(j=1;j<i;j++)
            if(ia->pt[j]<ia->pt[j-1]){
                t=ia->pt[j-1];
                ia->pt[j-1]=ia->pt[j];
                ia->pt[j]=t;
            }
}
void printarray(intArr *ia){
    int n=ia->cur;
    while(n>0)
        printf("%3d\t",ia->pt[--n]);
    printf("\n");
}
void insertarray(intArr *ia,int t){
    if(ia->cur>=ia->len)
        ia->pt=(int *)realloc(ia,ia->len+=10);
    if(ia->pt)
        ia->pt[ia->cur++]=t;
    bubblesort(ia);
    printarray(ia);
}
int main(){
    intArr *ia,iA;
    int i;
    ia=&iA;
    ia->pt=(int *)calloc(10,sizeof(int));
    ia->cur=0,ia->len=10;
    printf("输入待排序数列,以空格间隔,以0结尾\n");
    scanf("%d",&i);
    while(i!=0)
       insertarray(ia,i),
       scanf("%d",&i);
    system("pause");
    free(ia->pt);
    return 0;
}

ISEUWEI
ISEUWEI   2016.04.04 16:57

这是其中一次测试结果
图片说明

ISEUWEI
ISEUWEI   2016.04.04 16:58

可以看到26 54错位,54 64错位

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C语言中的冒泡排序(2种)和选择排序
#include <stdio.h> #include <stdlib.h>//冒泡排序1 void popupSort1(int *p,int len) { int i,j; for(i = 0;i<len;i++) { for(j = 0;j<len-i-1;j++) { if(p[j]>p[j+1])
C语言冒泡排序法和选择排序法的区别
冒泡排序法: #define _CRT_SECURE_NO_WARNINGS 1 #include #include #include void rank(int arr[], int len) { int i = 0; int j = 0; int temp = 0; for (i = 0; i < len-1; i++) { for (j = 0; j < len-1- i;
排序算法之冒泡排序<Bubble_Sort>及其C语言代码实现
概述 冒泡排序是一种相对简单的排序,它每次比较相邻的两个元素,如果前者大于后者,则交换< swap >这两个元素(从小到大排序),这样每一趟比较就把大的元素沉入最后,形象的称之为“冒泡”,每走一趟,实际上最尾的元素已经排好。 时间复杂度:o(n^2) 核心代码实现:void Bubble_Sort(int a[],int n)//冒泡排序 { int i,j; for(i=n-
冒泡排序系统
用于了解C语言中的冒泡排序的算法,精炼,简洁,有效帮助C语言初学者学习冒泡排序算法。
常见排序方法(c语言)---冒泡法,选择法
冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 /* 用选择法对10个数进行排序 */ #include void main(
冒泡排序算法及其优化
冒泡排序 1、介绍: 冒泡排序和选择排序的思想是蛮力法,冒泡,顾名思义,每次选择后面一个元素(最大或者最小)冒上来,从而得到一个有序的序列。比如对于序列:10、8、5、7、3、1的冒泡第一趟演示图示如图所示 可见第一趟过后做大元素10已经沉底,第二趟就对另外的8、5、7、3、1进行上述同样的比较冒泡,会使得最大元素8沉底,...... ,最终可得到一个有序序列。
c语言常见排序算法
排序算法 冒泡排序 快速排序 选择排序
arm汇编冒泡排序实现
主要是自己写的一个arm汇编小例子,冒泡排序汇编实现,可以再ads1.2和kiel(MDK)下调试运行
C语言:冒泡排序法(升序排序法)
任务代码: 执行情况: 知识总结: 冒泡排序法:也叫升序排序法,但是相比起二分法查找只能应用于有序数列,二如何将一个无序数列变的有序就可以使用冒泡排序法!!! 对上面的过程进行总结: 该思想体现在成续上的解法是: 实例: 冒泡排序不仅仅可以应用于数字同样可以应用于字符字母的快速排序: 心得体会:
C语言中冒泡法、选择法、插入法三种常见排序算法分析
一、冒泡法(起泡法)  算法要求:用起泡法对10个整数按升序排序。     算法分析:如果有n个数,则要进行n-1趟比较。在第1趟比较中要进行n-1次相邻元素的两两比较,在第j趟比较中要进行n-j次两两比较。比较的顺序从前往后,经过一趟比较后,将最值沉底(换到最后一个元素位置),最大值沉底为升序,最小值沉底为降序。     算法源代码: # include main() {   i