常见的排序

一.选择排序

思路:每次从待排序列中选出一个最小(大)值,然后放在序列的末尾位置,直到全部待排数据排完即可。

需要一个指针变量。

基本代码如下:

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]

列举出计数列表

000
0+offest(5)1+offest(5)2+offest(5)

 遍历列表arr,第一次,计数列表变为:

100
567

遍历完成后,计数列表变为:

202
567

然后根据这个计数列表,输出到排序列表中,从5开始:排序列表中依次添加5,5,7,7。

最后输出排序列表[5,5,7,7]。

个人理解:该排序方法就是将列表添加进入一个新的列表当中去,遍历初始列表,改变新列表所对应的值,然后根据该值,将该值所对应的下标添加到排序列表中,然后输出排序列表,所以最后输出的时一个新的列表而不是初始列表。需要注意偏移量带,通过代码消除偏移量带来的影响

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值