2 computer9507 computer9507 于 2016.05.04 15:36 提问

哪位大神能具体讲一下冒泡法和选择排序的用法,区别?

哪位大神能具体讲一下冒泡法和选择排序的用法,区别?图片说明图片说明图片说明图片说明

8个回答

qq423399099
qq423399099   Ds   Rxr 2016.05.04 15:55
已采纳

冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。

 #include <stdio.h>
#define SIZE 8

void bubble_sort(int a[], int n);

void bubble_sort(int a[], int n)
{
    int i, j, temp;
    for (j = 0; j < n - 1; j++)
        for (i = 0; i < n - 1 - j; i++)
        {
            if(a[i] > a[i + 1])
            {
                temp = a[i];
                a[i] = a[i + 1];
                a[i + 1] = temp;
            }
        }
}

int main()
{
    int number[SIZE] = {95, 45, 15, 78, 84, 51, 24, 12};
    int i;
    bubble_sort(number, SIZE);
    for (i = 0; i < SIZE; i++)
    {
        printf("%d", number[i]);
    }
    printf("\n");
}

选择排序每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。

 #include<stdio.h>
#include<stdlib.h>

void swap(int*a,int*b)
{
    int temp;
    temp=*a;
    *a=*b;
    *b=temp;
}
void select_sort(int A[],int n)
{
    register int i,j,min,m;
    for(i=0;i<n-1;i++)
    {
        min=i;//查找最小值
        for(j=i+1;j<n;j++)
        {
            if(A[min]>A[j])
            {
                min=j;
            }
        }
        if(min!=i)
        {
            swap(&A[min],&A[i]);
            printf("第%d趟排序结果为:\n",i+1);
            for(m=0;m<n;m++)
            {
                if(m>0)
                {
                    printf("");
                }
                printf("%d",A[m]);
            }
            printf("\n");
        }
    }
}
int main(void)
{
    int n;
    while(scanf("%d",&n)!=EOF)    /* VS2013等版本中需使用scanf_s(),VC6.0中使用scanf() */
    {
        int i;
        int*A=(int*)malloc(sizeof(int)*n);
        for(i=0;i<n;i++)
        {
            scanf("%d",&A[i]);
        }
        select_sort(A,n);
        printf("最终排序结果为:\n");
        for(i=0;i<n;i++)
        {
            if(i>0){
                printf("");
            }
            printf("%d",A[i]);
        }
        printf("\n");
    }
    return 0;
}

y269404905
y269404905   2016.05.04 15:55

区别就是 选择排序是扫描完整个数列后直接把最小的放到数列的第一位。
冒泡排序是在扫描过程中,遇到比前一个小的就直接互换位置。
用法直接度娘就行了 各个语言都有例子

beifengche
beifengche   2016.05.04 16:33

区别就是冒泡排序的交换次数不会小于选择排序的交换次数

qq_32371277
qq_32371277   2016.05.04 16:50

冒泡是两两比较,如果小就交换位置!!!
选择是每次选择最小的放在前面!!!

herozhangbz
herozhangbz   2016.05.04 19:18

看了大神的回答,我才发现我把冒泡排序跟选择排序混为一谈了。。。。。受教了

chenlxhf
chenlxhf   2016.05.06 18:06

自己去看看吧~~微博里的,有图有文字~!http://blog.csdn.net/chenlxhf/article/details/50880214

tanjunchen
tanjunchen   2016.05.09 16:27

冒泡是两两之间的比较 选择排序是每次选择最小或者最大的元素

wb_it_man
wb_it_man   2016.05.12 13:56

选择排序:第一次把整个待排空间的最小值求出来,然后与第一个数据交换位置。这样已排空间就有了第一个数据,之后重复该过程。
63 01 17 87 05 0763 17 87 05 0717 87 63 0787 63 1763 8787

冒泡排序:把第一个数据作为基准数据,与后面的数据进行对比,如果大于基准数据就交换位置,如果小于基准数据,就把基准数据变成当前的对比数据。
【63 01 17 87 05 07】
【01 63 17 87 05 07】
【01 17 63 87 05 07】63 和87比较 87大 所以从此处开始用87和后面的数据比较,63留在此处不动
【01 17 63 05 87 07】
【01 17 63 05 07 87】
【01 17 63 05 07】(87)

这两个算法的关键码比较次数都是由双重循环所决定,时间复杂度均为O(n*n),而且两个算法都是稳定的。

但是在数据量比较大时,选择排序效率比较高
图片说明

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!