C的实用笔记12——排序问题

习题1:用数组记录斐波那契数列的每一项

  1. 思路:仍然遵循我们在递推法求斐波那契数列的格式,区别是不再需要循环变量fn_0和fn_1
    1. 定义数组arr[30],将来用来保存斐波那契数列的前30项
    2. 设置递推入口:arr[0]=0; arr[1]=1;
    3. for循环,代表数组下标的循环变量i从2开始,<=30 时进入循环3.1 用递推公式:“第n项=第n-1项+第n-2项”,改变数组元素的值:arr[i]=arr[i-1]+arr[i-2];
    4. 输入想要获取数列的哪一项
    5. 打印这个斐波那契数列值

  2. 代码:
    #include 
    int main()
    { int arr[30];int i;	//表示数组下标的循环变量arr[0] = 0;arr[1] = 1;for (i=2; i<=30; i++){arr[i] = arr[i-1] + arr[i-2];}puts("请输入第几项(0~30)");scanf("%d", &i);printf("斐波那契数列的第%d项是%d\n", i, arr[i]);return 0;
    }

回顾我们之前用选择控制语句实现了两个和三个变量的排序,现在我们可以用循环控制语句 + 数组 的方式实现多个变量的排序。方法有三种:擂台法、冒泡法(也就是沉底法)、选择法。

习题2:用擂台法实现排序问题(从小到大,从大到小)

  1. 思路:回顾之前的习题就像擂台赛一样,是个两两对比的过程,比方说有甲乙丙三个人角逐冠亚季军,一开始甲站在冠军位置,乙站在亚军位置,丙站在季军位置:第一轮比赛,擂台摆在冠军归属地,也就是先让甲当擂主,他先和乙pk,假设乙赢了,那么乙站上擂台,甲站在亚军位置,然后乙再和丙pk,假设乙赢了,那么它们位置不变,所有pk完后还站在擂台上的是乙,所以乙是冠军;第二轮比赛,由于已经榜上有名了,冠军乙就不参加了,擂台移到季军归属地,现在甲站在上面,他要迎接丙的挑战,假设丙赢了,那么两人就换位置,所有pk完成后站在擂台上的是丙,所以丙是亚军;由于赛程结束,所以不需要进行第三轮比赛,甲自动成为季军。因此,总结一下,n个人打擂,需要进行n-1轮pk,其中第i轮比赛,需要进行n-1-i场比赛,因此外层循环变量i从0开始循环n-1次,由于每轮比赛擂台是固定的,所以,内层循环j从i+1开始,循环n-1-i次。细心的我们可以发现:①擂台法中,我们操作的对象是内存地址(擂台)
    /* 擂台法从大到小排序 */
    1. 定义一个数组arr[10]
    2. 用sizeof运算符获取数组长度len
    3. for循环,外层循环变量i用于控制比赛轮数和确定擂台位置,从0开始,

  2. 代码:
    #include 
    int main(int argc, char const *argv[])
    {int arr[10] = {5,3,6,9,8,1,4,7,10,2};int i, j;   //分别是外、内层循环变量int len = sizeof(arr) / sizeof(arr[0]); //数组长度int temp;   //用于交换的临时变量/* 1.擂台法(从大到小排列) */for(i=0; i arr[j]){  //擂台固定在arr[i]位置,让arr[j]轮流去挑战,大的退位temp = arr[i];arr[i] = arr[j];arr[j] = temp;      }}}puts("擂台法从小到大排序结果为:");for(i=0; i

习题3:用冒泡法实现排序问题(从小到大,从大到小)

  1. 思路:冒泡法顾名思义就是水在冒泡时,离杯底越远,泡泡越大。因此冒泡法从小到大排序其实将大的数浮上去,浮上去的同时,小的数就自动沉底,所以也称为沉底法。其实,冒泡法就是流动擂台法。以甲乙丙三人角逐冠亚季军为例,我们假设甲在农村,乙在乡镇,丙在城市:第一轮比赛,擂台摆在农村,也就是先让甲当擂主,他到乡镇布置擂台先和乙pk,假设甲赢了,那么乙滚到农村去,甲暂时带在乡镇,甲接下来到城市布置擂台再和丙pk,假设甲又赢了,那么丙滚到乡镇去,甲成为胜者呆在城市;第二轮比赛,擂台还是从农村开始摆,也就是让乙当擂主,他到乡镇布置擂台和丙pk,假设乙赢了,那么丙滚到农村去,乙成为胜者呆在乡镇。因此,总结一下,n个人打擂,需要进行n-1轮pk,其中第i轮比赛,需要进行n-1-i场比赛,因此外层循环变量i从0开始,循环n-1次,由于每轮比赛擂台是流动的,所以,内层循环j总是从0开始,循环n-1-i次。细心的我们可以发现:①冒泡法法中,我们操作的对象是内存地址(流动的擂台)
    /* 冒泡法从小到大排序 */
    1. 定义一个数组arr[10]
    2. 用sizeof运算符获取数组长度len
    3. for循环,外层循环变量i仅用于控制比赛轮数,从0开始,

  2. 代码:
    #include 
    int main(void)
    { int arr[10] = {5,3,6,9,8,1,4,7,10,2};int i, j;   //分别是外、内层循环变量int len = sizeof(arr) / sizeof(arr[0]); //数组长度int temp;   //用于交换的临时变量/* 1.冒泡法(从小到大排列) */for(i=0; i arr[j+1]){  //arr[j]是摆擂者,arr[j+1]是被挑战者,大的浮上去,所以用>判断temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}puts("冒泡法从小到大排序结果为:");for(i=0; i

习题4:用选择法实现排序问题(从小到大,从大到小)

  1. 思路:其实,选择法就是先记名次再换位的擂台法。还是以甲乙丙三个人角逐冠亚季军为例:甲乙丙三人在聚集在一起比赛,但是没有条件布置擂台,也就是说没法让群众直接看见这三个人互相比拼的过程,但是,人们发现夺得尚方宝剑之人可以称霸武林,尚方宝剑只有一把。一开始不妨让甲站在冠军位置,让乙站在亚军位置,让丙站在季军位置,先让甲暂时保管尚方宝剑。第一轮比赛,也就是先让拥有尚方宝剑的甲迎接乙的挑战,假设乙赢了,那么乙就从甲手中夺过尚方宝剑,但此时乙还没有和丙较量过,所以又不好直接坐上武林盟主的位置,甲乙丙三人的地位暂时不用改变,接着,拥有尚方宝剑的乙接受丙的挑战,假设乙赢了,那么第一轮所有pk结束后,尚方宝剑在乙手中,所以乙成功坐上冠军的位置,把甲挤到亚军位置;第二轮比赛,由于已经榜上有名了,冠军乙就不参加了,上方宝剑给到暂时的亚军,也就是甲,甲迎接丙的挑战,假设丙赢了,那么丙就从甲手中夺过尚方宝剑,第二轮所有pk完成后,尚方宝剑在丙手中,所以丙成功坐上亚军的位置,把甲挤到季军;由于赛程结束,所以不需要进行第三轮比赛,甲自动成为季军。因此,总结一下,n个人夺尚方宝剑,需要进行n-1轮pk,其中第i轮比赛,需要进行n-1-i场比赛,因此外层循环变量i从0开始,循环n-1次,每i轮比赛结束后拥有尚方宝剑的人坐上第i个位置,内层循环j从i+1开始,循环n-1-i次。细心的我们可以发现:①选择法中,我们操作的对象是变量(尚方宝剑)
    /* 选择法从大到小排序 */
    1. 定义一个数组arr[10]
    2. 用sizeof运算符获取数组长度len
    3. for循环,外层循环变量i用于控制比赛轮数和确定宝剑初始位置,从0开始,

  2. 代码:
    #include 
    int main(int argc, char const *argv[])
    {int arr[10] = {5,3,6,9,8,1,4,7,10,2};int i, j;   //分别是外、内层循环变量int len = sizeof(arr) / sizeof(arr[0]); //数组长度int sword;  //尚方宝剑int temp;   //用于交换的临时变量/* 1.选择法(从大到小排序) */for (i=0; i arr[j]){   //尚方宝剑在arr[sword]位置,让arr[j]轮流去挑战,小的夺走swordsword = j;}}if (sword != i){    //判断尚方宝剑是否还在第i个人手中temp = arr[i];arr[i] = arr[sword];arr[sword] = temp;  }}puts("选择法从小到大排序结果为:");for(i=0; i


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章