关于c语言选择法和冒泡法的区别,新手疑问

两种方法怎样区别,求简单解释图片说明图片说明图片说明

1.冒泡排序基本思想就是对一组数据自上而下,对相邻的两个数作比较,每次让大的气泡向下沉,让小的气泡向上浮。
例如:3,1,9,2 几个数字,第一轮:3和1比较,3>1,所以交换位置;继续3和9比较,32,9和2交换;
结果:1,3,2,9

经过这样一轮比较,最大的数就沉到了最底部,下次比较不用再和9比较了,比较到倒数第二个就可以了,依次比较下去,比较次数为n*(n-1)/2

2.选择排序基本思想是对一组数据中固定一个位置依次与后面的数做比较,如果后面的数小于这个位置的数,则交换位置
还拿 3,1,9,2 作为例子,第一个位置 跟第二个位置作比较,3>1,交换位置:1,3,9,2;第一个位置跟第三个位置比较,1<9,不交换;第一个位置跟第四个位置比较,1<2,不做交换;
结果:1,3,9,2
第一个位置变成了最小的,所以不参与下轮比较,下次从第二个位置做比较,依次类推,比较次数也是n*(n-1)/2

区别:
1.冒泡排序每轮把参与排序中最大的数放在最底部;选择排序每轮参与排序中最小的数放在最顶部
2.冒泡排序总是比较相邻的两个数,在排序数列中不断移动;选择排序固定一个比较数,被比较数位置不断移动

用图来表示大致是这样的,圈代表参与比较的数,只是第一轮的:
图片说明

希望对你有帮助

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

  #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;
}

http://www.doc88.com/p-9347124862167.html
个人比较喜欢选择法,直观而且复杂度稍低

选择法,有一个选择的过程,一般是在待排序的序列中选出一个最小的和第一个元素交换。冒泡的特征是相邻两个比较,交换。



for(int i=0; i<v.size(); i++){
int min = v[i];
int temp;
int index = i;
for(int j=i+1;j<v.size();j++){
if(v[j] < min){
min = v[j];
index = j;
}

}

            temp = v[i]; 
            v[i] = min;
            v[index]= temp;
    }

这就是选择排序,你看到它有一个选择待排序最小,并且在最后交换的过程



for (int i = 0; i < unsorted.Length; i++)
            {
                for (int j = i; j < unsorted.Length; j++)
                {
                    if (unsorted[i] > unsorted[j])
                    {
                        int temp = unsorted[i];
                        unsorted[i] = unsorted[j];
                        unsorted[j] = temp;
                    }
                }
            }


这是冒泡,很明显,它在内侧循环直接比较并且立即交换

选择法是选择排序么?一般书上都写的是冒泡排序,其实这两个排序都用的不多吧,冒泡排序稳定逻辑比较清楚,选择排序是不稳定的

冒泡:把最小的数放在最后,不断地把底层的较大的数冒泡升上来;
选择:用一个变量不断地选择小的数,将值付给变量再通过变量付给相应位置的数组元素。

不知道为什么有人说选择排序不稳定,
数据量为50000个int
优化冒泡时间为 :12672
冒泡处理时间为 :12500
选择处理时间为 :7687
优化选择时间为 :7657

数据量为50000个int
优化冒泡时间为 :12734
冒泡处理时间为 :12500
选择处理时间为 :7688
优化选择时间为 :7656

数据量为50000个int
优化冒泡时间为 :12609
冒泡处理时间为 :12625
选择处理时间为 :7656
优化选择时间为 :7672

数据量为50000个int
优化冒泡时间为 :12656
冒泡处理时间为 :12500
选择处理时间为 :7687
优化选择时间为 :7704

数据量为50000个int
优化冒泡时间为 :12765
冒泡处理时间为 :12625
选择处理时间为 :7703
优化选择时间为 :7672

数据量为5W,排序所花的时间以上4种方案经过比较,选择排序法比冒泡排序法要快很多,大概在450ms左右,而所谓的优化排序法并不见得是好的排序方法,除了在选择排序法中有时候能快30ms左右外,冒泡排序法一般效率还慢了100多ms.而在选择排序法中有时候其实也比普通的选择排序法慢.所以,排序方法基本上用最传统的选择排序已经完全可以胜任!
--也许我真的忘记了那种特别有效的排序方法,记得好像只用一个循环,可我怎么也想不出来,只用一个循环怎么可能对一个数组进行排序呢!当然,很明显上次注意到的排序方法有两个特别的知识的点,可惜我只记得一个点,另一个点什么时候才能想起来呢!
原文:http://blog.sina.com.cn/s/blog_4b146a9c0100rb1c.html
选择法跟冒泡排序都是稳定的排序方法,选择法更为优秀。

为了帮助你记忆,就是比较的方式有差别,然后对于数据的多少与数据的趋势有一些差别

给你一个链接吧,动态图演示排序的各种算法。
http://www.blogjava.net/todayx-org/archive/2012/01/08/368091.html

选择排序:每次从待排序序列中选择一个关键字最小的元素(当需要按关键字升序排列时),顺序排在已排序序列的最后,直至全部排完。
冒泡排序:两两比较待排序序列中的元素,并交换不满足顺序要求的各对元素,直到全部满足顺序要求为止。

大神都解释了,应该理解了吧。格式很好区分,使用也很简单的