刚接触程序语言的时候,经常会用到一些排序的问题,按照算法运行效率和理解上面来看的话,有的时候我们可以记录一些比较便于理解的;
1:如果一个班有5个同学考试成绩如下,需要我们通过程序的方式来对成绩从高到低来排序,学生成绩如下:
88,52,67,93,87(各个同学的成绩不相等)
方法一:
list = [88,52,67,93,87] #将这5个学生的成绩存入列表或者数组
rank = [1,1,1,1,1] #新设置一个列表(数组)用于存放list列表中各个元素的排位情况(长度需要跟list一致),这个地方之所以把每个元素设置为1,程序中可以理解
new=[0,0,0,0,0] #定义一个新的列表(数组),用于存放排序后的成绩
for j in range(0,5): #此处用python的语法,用C语言可以是 for(j=0,j<5,j++),此循环设置的目的是用于遍历list列表(数组)
sm = list[j] #将列表(数组)中第一个值赋值给 sm,暂存list元素的值,用于设定后面的值来跟本值的比较,从list第一个元素(88)开始---87结束
for m in list: #再设定一个循环来提取list的每个元素与刚才暂存的sm来比较
if m > sm:
rank[j]=rank[j]+1 #此处是比较关键的,当后面提取出来list元素的值比暂存的sm的值大的时候,rank[j]对应的值就加1;这里要说明一下,比如提取的是“93”,因为93比
88的值要大,所以按照排序的位置,93就要排到88的前面,如果93排的是“1”号位置,那么88通过本次比较就往后移动1位;因本来我们设定的rank里 #面各元素的值都是1,于是当我们把里面的值“+1”的次数统计出来后,自然就记录好了这个数在整个数列中应该排的位置。
print(rank) #于是得出的rank的结果是:[2,5,4,1,3] ,证明,list中的各个数据对应的排序位置应该是2,5,4,1,3
for n in range(0,5): #再次设置一个5次循环,用于遍历list
new[rank[n]-1]=list[n] #分别把list当前的值替换新列表中排位中的数据,比如88应该排第二位,那就替换新列表中2号位置的数据,new[1](rank[n]-1 列表和数组位置从0开始 #的,所以此处记得“-1”)
print(new) #执行后结果:[93, 88, 87, 67, 52]
分析:如果按照冒泡排序的方式,就是每次比较2个数字,譬如A,B,C,D,E,步骤:1,A与B比较,如果A大 2,拿A去跟C比较,如果A比C大 3,A跟D比较,如果A比D大。4,A与E比较。那么问题来了,A是比较出来了,是最大的,关键是B,C,D,E之间还得重新比较一下又要重新交换位置,尤其是数据多了以后,程序就不太便于理解;而设置一个跟原数组同长度的数组后,就便于理解和记录每个元素应该排放的位置了;当然这是个例子,本题数据是不相同的,那么数据相同了的话,要做多两层判断了,留下供思考;
方法二:因python中有自带的一些实用的函数,处理起来就非常的简便了
list2=[93, 88, 87, 67, 52]
list2.sort(reverse=True)
print(list2) #此时不管里面是否有相同分数的,都可以正常排序出来(只是我们没有研究sort内部的算法)