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\n", 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的位置。

 

posted @ 2021-07-15 23:37  朱小勇  阅读(586)  评论(0编辑  收藏  举报