刚接触程序语言的时候,经常会用到一些排序的问题,按照算法运行效率和理解上面来看的话,有的时候我们可以记录一些比较便于理解的;

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内部的算法)