排序,从字面上讲,就是选择一组序列中的元素。
比如给定一组数列,要求对其元素从小到大排序,那么每次排序只需要选择数列第一位最小的元素,第二次排序和第三次排序也是一样,这样后面数列中最小的元素被选中,放在已经排序的元素的末尾,直到最后没有元素可以排序。
这里有几点需要注意:
1。第一种排序是遍历整个序列,选择最小的元素放在第一位。
2。第二次排序开始时,遍历除第一个元素以外的后续序列,选择后续序列中最小的元素,放在第一个元素后面一个位置。
3。第三次排序也是如此,直到最后一次排序打印出从小到大的整个序列。
可以发现,在选择和排序的过程中,每次最重要的是选择最小的元素并排序。
理清逻辑,画流程图。
为了让整个过程更清晰,我画了一个流程图,也可以帮助我后面的理解。
这里最困惑的是我写代码逻辑容易出现的问题,就是这个交换位置应该放在哪边。所以为了说的更清楚,我打算用实际例子来举例说明。
外循环是遍历数组中的所有元素,内循环是遍历除当前元素以外的所有元素,然后进行条件判断,即找出最小的元素,然后与当前元素交换位置。
然后,当内部循环遍历时,它可能会遍历许多比当前元素更小的元素。如果在这里交换位置,那岂不是交换了很多次,与我们的预期不符,所以交换位置不能放在内圈。
所以逻辑应该改成:在内循环之后,选择最小的元素,然后交换位置。
代码实现:
//选择排序#include<stdio.h>int ***in() { int Select[9] = {100, 3, 7, 6, 55, 29, 33, 10, -12}; int Temp = 0; int index = 0; for(int i = 0; i < 9; i++){ index = i; for(int j = i+1; j<9;j++){ if(Select[j]<Select[index]){ index = j; } } Temp = Select[i]; Select[i] = Select[index]; Select[index] = Temp; for(int i = 0; i < 9; i++){ printf("%d ", Select[i]); } printf("n"); }}
大家可以看到,交换位置的逻辑和冒泡排序、直接插入排序没有太大的区别,只是这里交换位置的时候,必须选择最小的元素再交换,而不是找一个最小的元素直接交换位置。
试验结果
摘要
一般来说,选择排序并不难,但是如果刚开始学习数据结构,就有些不清楚了。最重要的是理清逻辑。理清逻辑后,因为内循环的主要目的是求最小元素,所以如果在内循环中交换位置就没有意义了,只好在内循环外交换位置。
总的来说不难,测试结果和我们最终预期的一样。
本文来自奶味小仙女投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/653718.html