一.选择排序
思路:每次从待排序列中选出一个最小(大)值,然后放在序列的末尾位置,直到全部待排数据排完即可。
需要一个指针变量。
基本代码如下:
arr=[8,3,2,6,1,4,9]
for i in range(0,len(arr)): #依次获取列表中的每个变量
for j in range(i+1,len(arr)): #依次获取变量'i'后面的所有变量
if arr[i]>=arr[j]: #比较两个数之间的大小
arr[i],arr[j]=arr[j],arr[i]
print(arr)
定义一个长度为len的数组arr, 从数组的第一个数开始赋值给i,然后将i后面的每个值赋予j,并且比较两个数字之间的大小,然后根据排序的方式是升序还是降序选择判断条件,判断是否需要交换两个数之间的位置,直到i获取到最后一个数。
注意:i可以不用获取数组的最后一个数,因为经过前面的循环,已经将最大或最小的值确定,并且将该数字放在最后的位置,所以不用获取数组的最后一个数,程序也可以正常运行
即:
for i in range(0,len(arr)-1):
个人理解:该排序方法获取一个值后,将该值与其他数依次比较,即使比出大小后交换位置,指针也一直指向最开始获取的值,即,该排序方法一直比较一个数与其他数的大小,指针不会指向其他的数,直到该层循环结束。
二.冒泡排序
思路:每次排序选出一个最大(小)值,放在末尾。
需要一个指针变量。
基本代码如下:
arr=[1,5,4,3,6,8]
for i in range(0,len(arr)-1):
for j in range(0,len(a)-i-1):
if arr[j]>=arr[j+1]:
arr[j],arr[j+1]=arr[j+1],arr[j]
定义一个长度为len的数组arr,先定义一个外层循环确保排序的完成,然后将数组的第一个数赋值给j(第二层循环的每一次循坏都是从数组的第一个值开始赋值给j)比较arr[j]与arr[j+1]的值,根据排序方法判断是否交换两个数。然后继续重复,直到排序结束
注意:
for j in range (0,len(arr)-i-1):
由于冒泡排序的每一次循环都会找出当前数组的最大(小)值并且放在最后,所以每一次循环之后,数组的一个位置的值就确定了,不用再将他与其他数进行比较。
个人理解:该排序方法的指针所指向的数也会变,可以理解为在该循环中指针指向的是一个位置而不是一个数,即,该排序方法指针指向的数字会变化。第一次循环后找出一个最大(小)的值放在最后,第二次循环找出第二大(小)的值放在最后,直到排序的完成。
三.插入排序
思路:将第n个元素插入到前方n-1个元素之间,直到序列有序
需要两个指针
基本代码如下:
arr=[1,5,4,3,6,8]
for i in range(1,len(arr)):
for j in range(i,0,-1):
if arr[j]<=arr[j-1]:
arr[j],arr[j-1]=arr[j-1],arr[j]
定义一个长度为len的数组arr,先确定第一个指针的位置(从数组的第二个值开始,从第一个开始没有意义,因为前面没有任何值,无法比较),然后依次获取第一个指针前面的值,比较两个数字的大小,然后根据排序方法判断是否交换位置,直到循环结束。
个人理解:该排序方法与冒泡排序有着相似之处,只是将排序方向变换。该排序方法需要先确定一个数,可以假设该数的前面所有数都是有序的,将确定的数插入有序数组,当进行一次循环后,该数的前面的所有数就会变成有序,直到遍历完整个数组。
四.计数排序
需要两个新数组
基本代码:
#定义初始列表
arr=[1,5,7,4,8,6,8]
max_num=0
min_num=0
a=0
#获取初始列表的最大值和最小值
for i in range(0,len(arr)):
if max_num<arr[i]:
max_num=arr[i]
if min_num>arr[i]:
min_num=arr[i]
#计算新数组的长度
l=max_num-min_num+1
#偏移量
offset=min_num
#初始化计数列表,使元素全为0
x=[0]*l
#定义排序后的列表
y=[]
#计数
for i in range(0,len(arr)):
#遍历初始列表,当初始列表中的值与计数列表的下标相等,计数列表该下标对应的值加一
a=arr[i]
x[a-offset]+=1
#遍历计数列表,根据列表中的每一个值a,输出相对应的下标数a次,并将其添加到排序列表中
for i in range(0,len(x)):
a=x[i]
for j in range(0,a):
y+=[i]+offset
print(y)
例如:一个列表arr=[5,7,5,7]
列举出计数列表
0 | 0 | 0 |
0+offest(5) | 1+offest(5) | 2+offest(5) |
遍历列表arr,第一次,计数列表变为:
1 | 0 | 0 |
5 | 6 | 7 |
遍历完成后,计数列表变为:
2 | 0 | 2 |
5 | 6 | 7 |
然后根据这个计数列表,输出到排序列表中,从5开始:排序列表中依次添加5,5,7,7。
最后输出排序列表[5,5,7,7]。