常见的排序方法:
1:冒泡排序
2:选择排序
3:插入排序
4:希尔排序
5:堆排序
6:归并排序
7:快速排序
一、冒泡排序:
思想:逐个对比,逐个交换,把一个最大值或最小值放到队列尾部,下一次将次大值或次小值放到倒数第二位,以此类推知道排序结束。
例:
将[2,3,1,5]排序:
list_01=[2,3,1,5]
for i in range(len(list_01)-1):
for j in range(0,len(list_01)-1-i):
if list_01[j]>list_01[j+1]:
list_01[j],list_01[j+1]=list_01[j+1],list_01[j]
print(list_01)
结果为[1,2,3,5]
二、选择排序:
思想:选择排序就是让列表中的第一个数值,第二个数值,第三个数值跟他后面的数据进行比较(不跟本数据前面的数据进行比较),后面的数据有小于该数据的数(Data),就让数Data跟第N数进行位置交换。
例:
list=[54,76,12,500,200,43,1,22] for i in range(len(list)): min_index=i for j in range(i+1,len(list)): if list[min_index]>list[j]: min_index=j list[i],list[min_index]=list[min_index],list[i] print(list)
过程:
1:找到后八个数中最小的是1,将1与第一个数(54交换)
结果为[1,76,12,500,200,43,54,22]
2::找到后七个数中最小的是12,与第二个数交换
3:找到后六个数中最小的是22,与第三个数交换
以此类推
三、插入排序
思想:先将列表的第一个数单独算成一部分,其余的数算作第二部分,每次将第二部分的最小值插入第一部分的值后面,将该值与第一部分中已经存在的值从后往前依次比较,直到找到其应在的位置。
例:
list=[54,26,93,17,77,31,44,55,20] for i in range(1,len(list)): #代表从下标为1的位置开始拿数与前面的比较,再拿下标为2的数与前面的数进行比较 for j in range(i,0,-1): if list[j]<list[j-1]: list[j],list[j-1]=list[j-1],list[j] print(list)
结果:
[17, 20, 26, 31, 44, 54, 55, 77, 93]
过程:
1:将26插入[54],并比较26和54,因为26<54,所以第一部分变为[26,54]
2:将93插入第一部分,比较93和54,因为93>54,所以第一部分变为[26,54,93]
以此类推
四、希尔排序:
思想:希尔排序是插入排序的一种。也叫做缩小增量排序。是直接插入排序的更高效的改进版。希尔排序是非稳定排序算法。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越
多,当增量减至1时,整个文件恰被分成一组,算法便终止。
例:
[54,26,93,17,77,31,44,55,20,70]
第一次:增量为5:
54与31比较:31---54
26与44比较:26---44
93与55比较:55---93
17与20比较:17---20
77与70比较:70---77
第一次结果为[31,26,55,17,70,54,44,93,20,77]
第二次:增量为2:
31---55---70---44---20:20---31---44---55---70
---26---17---54---93---77:17---26---54---77---93
第二次结果为[20,17,31,26,44,54,55,77,70,93]
第三次:增量为1:
结果[17,20,26,31,44,54,55,70,77,93]
五、快速排序:
思想:先将列表的第一个数单独算成一部分,其余的数算作第二部分,生成代表low和代表high的两个指针,low从第二部分的左边向右移动,high从第二部分的右边向左移动,如果low位置的数大于high位置的数,则将两个位置的数字交换,然后两个指针继续向中间移动,直到low=high时,将第一部分的数插入该位置前面,此时该数字左边的数字都比他小,右边的数都比他大。此时列表的第一个数和后面的数分开进行第二轮比较。(看元素最终放到有序序列的哪个位置)