• C语言冒泡排序法


     代码:

    #include <stdio.h>
    #include <string.h>
    
    #define NAME_LENGTH 256
    #define PERSON_COUNT 3
    struct Person {
        char name[NAME_LENGTH];
        int moneyNum;
    };
    
    void inputPersonsInfo(struct Person* persons)
    {
        int i = 0;
        for(; i<PERSON_COUNT; ++i){
            scanf("%s %d", persons[i].name, &(persons[i].moneyNum));//name本来就是地址,不用取地址符号
        }
    }
    
    void sortByMoneyNum(struct Person* persons)
    {
        struct Person tPerson;
        int i, j;
        for(i=0; i<(PERSON_COUNT-1); ++i){
            for(j=0; j<(PERSON_COUNT-i-1); ++j){
                memset(&tPerson, 0, sizeof (tPerson));
                if(persons[j].moneyNum > persons[j+1].moneyNum){
                    memcpy(&tPerson, &persons[j], sizeof(tPerson));
                    memcpy(&persons[j], &persons[j+1], sizeof(tPerson));
                    memcpy(&persons[j+1], &tPerson, sizeof(tPerson));
                }
            }
        }
    }
    
    int main(int argc, char* argv[])
    {
        struct Person persons[PERSON_COUNT];
        (void)inputPersonsInfo(persons);
        (void)sortByMoneyNum(persons);
        int i=0;
        for(; i<PERSON_COUNT; ++i){
            printf("%d %s
    ", persons[i].moneyNum, persons[i].name);
        }
        return 0;
    }

     以从小到大的排序举例,所谓的冒泡法,就是如下过程:

     第1次:将列表里第1大的数字冒泡到倒数第1的位置;

     第2次:将列表里第2大的数字冒泡到倒数第2的位置;

     第3次:将列表里第3大的数字冒泡到倒数第3的位置;

     ...

     第n-1次:将列表里第n-1大的数字冒泡到倒数第n-1的位置;

     而不需要做第n次冒泡,因为剩下的就是最后一个数,就是最小的,并且位置是在最左边。

     根据这个概念看上面代码,核心就是上面两句话:

    for(i=0; i<(PERSON_COUNT-1); ++i){
        for(j=0; j<(PERSON_COUNT-i-1); ++j){
             //exchange      
        }
    } 

    第一个循环是要找多少次最值【已经找到了的不算】,一共需要找n-1次,最后一个值不需要再判断,已经是最值了;

    第二个循环,是找每个最值的时候,需要冒泡多少次,即从第0个开始,一直冒泡到合适的地方,找第i个最值,要把这个值放在n-1-i的位置。




    长风破浪会有时,直挂云帆济沧海!
    可通过下方链接找到博主
    https://www.cnblogs.com/judes/p/10875138.html
  • 相关阅读:
    css的em是根据什么来写的
    向一个对象数组里面添加新的属性 + 将一个对象数组数据拿出来变成另一个对象
    微信里iphone后退不刷新问题解决方案
    进到页面后input输入框自动获取焦点
    jquery checkbox反复调用attr('checked', true/false)只有第一次生效
    js promise中如何取到[[PromiseValue]]
    js 取得当天0点 / 23:59:59 时间
    jQuery获取包括当前元素的HTML
    C++ 实现 STL 标准库和算法(二)template 编程和迭代器粗解 实验楼笔记
    我现在怎么写博客笔记?
  • 原文地址:https://www.cnblogs.com/judes/p/15018099.html
Copyright © 2020-2023  润新知