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

问题描述

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

两种方法怎样区别,求简单解释

解决方案

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.冒泡排序总是比较相邻的两个数,在排序数列中不断移动;选择排序固定一个比较数,被比较数位置不断移动

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

希望对你有帮助

解决方案四:

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

解决方案五:

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

解决方案六:



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

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

解决方案七:

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

  #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("
");
}

选择排序每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法(比如序列[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趟排序结果为:
",i+1);
            for(m=0;m<n;m++)
            {
                if(m>0)
                {
                    printf("");
                }
                printf("%d",A[m]);
            }
            printf("
");
        }
    }
}
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("最终排序结果为:
");
        for(i=0;i<n;i++)
        {
            if(i>0){
                printf("");
            }
            printf("%d",A[i]);
        }
        printf("
");
    }
    return 0;
}

解决方案八:

不知道为什么有人说选择排序不稳定,
数据量为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

时间: 2024-08-07 15:32:03

编程c语言-关于c语言选择法和冒泡法的区别,新手疑问的相关文章

单链表-C语言选择排序法和冒泡法区别问题

问题描述 C语言选择排序法和冒泡法区别问题 编程实现将给定的一组整数采用选择排序法按由小到大的顺序排序.要求: 1) 编写函数create()根据已知整数数组构造一个单链表,假设结点只有一个整数数据域. 2) 编写函数sort()采用选择排序方法对已知链表进行排序. 3) 在主函数中完成数据的输入与结果的输出. ===我自己写了一个程序,但是不确定选择排序法是什么,求大侠帮忙看下我写的代码sort()是选择排序吗?感觉自己混淆了选择排序法和冒泡排序了,求教如何区别? #include #incl

Android编程实现获取当前系统语言及地区并更改语言的方法

本文实例讲述了Android编程实现获取当前系统语言及地区并更改语言的方法.分享给大家供大家参考,具体如下: 如果想获取手机的当前系统语言,可以通过Locale类获取,主要方法: Locale.getDefault().getLanguage() 返回的是es或者zh:通过 Locale.getDefault().getCountry() 获取当前国家或地区,返回为CN或US: 如果当前手机设置为中文-中国,则使用此方法返回zh-CN,同理可得到其他语言与地区的信息. 1.首先,如果要程序自动适

可编程渲染管线与着色器语言

Programming pipeline & shading language 大家好,今天想给大家介绍一下可编程渲染管线和着色器语言的相关基础知识,使想上手SHADER编程的童鞋们可以快速揭开SHADER语言的神秘面纱 由于时间有限,我决定只讲三个主要方面的内容,其过程中肯定会有不详细之处,还请见谅,就算是抛砖引玉,给大家一个简单的入门引路. 本章内容总共分为三个部分 一.3D渲染管线工作流程 二.可编程管线 三.着色器语言 3D渲染管线作为整个工作流程的基础,是不可或缺的基本知识.因此,作一

网站建设-语言、框架等选择

问题描述 网站建设-语言.框架等选择 想要做一个网站,要达到的目标是: 1. 网站内容在各类终端(PC,Android,iPhone)都能正常访问和显示, 2. 能和微信公众号数据互通: 3. 满足十万人的数据访问: 现在问题: 1. 推荐满足条件的,方便开发的前后台语言,并比较这几种选择之间的优劣: 2. 后台数据库怎么选择: 3. 网站服务器租用,以及托管方法: 4. 网站如何维护: 小弟网站这一块没有涉及,还请大侠不吝赐教. 解决方案 先说下你的目标: 1.网站内容能正常访问是跟前台有关的

Go语言实现冒泡排序、选择排序、快速排序及插入排序的方法_Golang

本文实例讲述了Go语言实现冒泡排序.选择排序.快速排序及插入排序的方法.分享给大家供大家参考.具体分析如下: 算法是程序的灵魂,而排序算法则是一种最基本的算法.排序算法有许多种,这里介绍4中排序算法:冒泡排序,选择排序,快速排序和插入排序,以从小到大为例. 一.冒泡排序 冒泡排序的原理是,对给定的数组进行多次遍历,每次均比较相邻的两个数,如果前一个比后一个大,则交换这两个数.经过第一次遍历之后,最大的数就在最右侧了:第二次遍历之后,第二大的数就在右数第二个位置了:以此类推. 复制代码 代码如下:

c语言排序问题简单的选择排序

问题描述 c语言排序问题简单的选择排序 #include#define N 20void px(int a[],int n){ int i,j,t,min; for(i=0;ia[j]) { t=a[j]; a[j]=min; min=t; } } printf("%d ",a[i]); }}int main(){ int a[N],n,i; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",a

《面向ArcGIS的Python脚本编程》——1.3 脚本语言和程序语言

1.3 脚本语言和程序语言 面向ArcGIS的Python脚本编程Python作为一门程序语言,也常被称为脚本语言.那么,两者的区别在哪里呢?一般而言,脚本语言用于控制其他应用程序以实现任务自动化:而程序语言则是用于开发结构复杂.功能完备的应用程序.脚本语言是一种"粘合剂",它可以将不同的组件组合在一起,从而实现新的功能.而系统语言既可以从头构建组件,也可以将组件组装成不同的应用程序.系统语言(例如C++和.NET)通过计算机的低级图元和原始资源从头开始创建应用程序.脚本语言(例如Py

《 Python树莓派编程》——第3章 Python介绍 3.1 脚本语言与程序设计语言

第3章 Python介绍 你可能还记得我们在第1章中提到,制作树莓派的初衷是为了让每个人(尤其是孩子们)都拥有编程的环境.为了实现该目的,树莓派的创造者们想要推出一台价格相对便宜但性能十分强劲的计算机,每个人都可以将这台计算机连接至键盘.鼠标.显示器进行编程. 创造树莓派的另一个原因是希望简化编程.为此,Eben Upton和他的同伴决定将Python语言集成到树莓派的操作系统中.他们认为,Python是一种强大的编程语言,那些没有编程经验的人也可以轻松快速地学会. 在本章,我将对Python进

Android编程实现动态支持多语言的方法

本文实例讲述了Android编程实现动态支持多语言的方法.分享给大家供大家参考,具体如下: 资源文件values/strings.xml中添加 <string name="current_language">English</string> <string name="test">test</string> 创建values-en文件夹,添加资源文件 strings.xml: <resources> <