代码:
#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的位置。