A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

谁有更好的方法学习c语言中的选择排序和冒泡排序,求大神指点

9 个回复

倒序浏览
看下算法书把,上面一般会有伪代码
把代码弄懂,算法是一种思想,多用就知道了,代码一定要熟悉
另,找找百度百科
回复 使用道具 举报
Marlong 发表于 2015-11-7 23:06
看下算法书把,上面一般会有伪代码
把代码弄懂,算法是一种思想,多用就知道了,代码一定要熟悉
另,找找百 ...

哪里有算法书?
回复 使用道具 举报
百度搜索  数据结构与算法
回复 使用道具 举报
/*
把124385按照从大到小排列----选择排序
思想:从左往右----6个数比较5轮.假先讲第一轮:设第一个是最大值,与第二个值比较,若大于第二个值,交换位置,否则不交不交换,然后和第三个值比较,依次比较五次,第一轮过后,找出最大值放在左边第一位.现在开始第二轮,除了第一轮找出的最大值外,还剩五个值需要比较,这是要比较四次找出次最大值,从第二位开始,依次与第三个数比较,重复第一轮比较思想,知道全部找到次次最大值放在第二位,第三位第四位,...,第六位,以此打印输出.
*/
#include <stdio.h>
int main()
{
    //要排序的数组
    int a[] = {1,2,4,3,8,5};
    //最大值的脚标
    int tempIndexMax = 0;
    for(int i = 0; i<5 ; i++)//第几轮排序
    {
        int tempIndexMax = i;
        for(int j = i+1; j<6;j++)//当前这轮排序的具体实现
        {
            if(a[tempIndexMax]<a[j])//a[j]是否大于先前的"最大值"
            {
                tempIndexMax=j; //如果a[j]大于先前"最大值",改变"最大值的脚标"
            }
        }
        //输出每轮排序的最大值脚标
        printf("第%d轮排序的最大值脚标是%d\n",i,tempIndexMax);
        //把找到的最大值和之前的最大值互换
        int temp = a[i];
        a[i]=a[tempIndexMax];
        a[tempIndexMax] = temp;
    }
    for(int k = 0; k<6 ;k++)
    {
        printf("%d\t",a[k]);
    }
}
/*
把124385按照从大到小排列----冒泡排序
思想:从右往左---主要是找到最小值放到右边最后一位,次最小值,放到倒数第二位,依次,找到最大值放到第一位,
也要比较5轮,第一轮比较6个数比较5次,... 依次类推.
#include <stdio.h>
int main()
{
    int a[] = {1,2,4,3,8,5};
    //数组总共有多少元素
    int n = (sizeof a)/(sizeof (int));//n=24/4=6
    //定义一个中间变量用于交换数据
    int t=0;
    // 要进行n-1轮排序(从i=0到i=n-2,i=0,1,2,3,4)
    for(int i = 0;i<n-1;i++)//i<6-1=5,i=0,1,2,3,4,5
    {
        for(int j=0;j<n-1-i;j++)//j<5-i,j=0,1,2,3,4,5
        {
            if(a[j]<a[j+1])
            {
                t = a[j];
                a[j] = a[j+1];
                a[j+1] = t;
            }
        }
    }
    for(int k=0;k<n;k++)
    {
        printf("%d\t",a[k]);
    }
}
/*
*冒泡排序
*/
#include <stdio.h>
int main()
{
    int a[] = {1,2,4,3,8,5};
    //数组总共有多少元素
    int n = (sizeof a)/(sizeof (int));//n=24/4=6
    //定义一个中间变量用于交换数据
    int t=0;
    // 要进行n-1轮排序(从i=0到i=n-2,i=0,1,2,3,4)
    for(int i = 0;i<n-1;i++)//i<6-1=5,i=0,1,2,3,4,5
    {
        for(int j=0;j<n-1-i;j++)//j<5-i,j=0,1,2,3,4,5
        {
            if(a[j]<a[j+1])
            {
                t = a[j];
                a[j] = a[j+1];
                a[j+1] = t;
            }
        }
    }
    for(int k=0;k<n;k++)
    {
        printf("%d\t",a[k]);//打印输出排好的序列
    }
}


回复 使用道具 举报 2 0
学习了,默默飘过
回复 使用道具 举报
toveyloves 来自手机 中级黑马 2015-11-8 01:07:02
7#
排序没多少种,选择和冒泡排序只是其中一部分,不会你对着敲七遍,不会你可以打死我!另外,这只是最没办法的办法,最好的是理解的敲,然后独立的敲,带上注释,思考算法,因为算法才是程序的灵魂最主要的核心。
回复 使用道具 举报
对 光看代码是没用的,还得学他的想法步骤
回复 使用道具 举报 1 0
865393462 来自手机 中级黑马 2015-11-8 10:55:01
9#
选择排序我将i<5变成<6打印出来的怎么会是885432!我的怎么不见了!
回复 使用道具 举报

越界了,当i=5时取到a[6],a[6]其实是不存在的,取的可能是一个垃圾数
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马