几种排序算法
1.直接插入排序,按升序排原理代码
2.直接选择排序,按升序排原理代码
3.希尔排序原理实例代码
4.冒泡排序原理实例代码
5.快速排序原理代码
1.直接插入排序,按升序排
原理
用两个for循环,外面的for循环是用来确定待插入有序序列的元素,里面的for循环是用来查找该元素插入的位置
首先要先找到应该插入的位置,然后将该位置后的元素后移,再将该元素插入到该位置,这样一次操作之后,该结点前的列表就是一个有序表了
直到将所有的元素都插入完,那么就是一个有序表了
代码
lst1
=[15,26,17,36,54,8,3,12]
def zhijiecharu(lst
):
for i
in range(len(lst
)):
enum
=lst
[i
]
for j
in range(len(lst
[0:i
])):
if lst
[i
] < lst
[j
]:
lst
[j
+1:i
+1]=lst
[j
:i
]
lst
[j
]=enum
break
return lst
print("直接插入排序的结果为:",zhijiecharu
(lst1
))
运行结果:
2.直接选择排序,按升序排
原理
将序列分为待排序和已排序的序列,已排序的序列放在最前面
每一次都会从待排序的序列找到最大/最小值,加入到已排序序列的最后/最前面的位置
代码
def choice_sort(lst
):
for i
in range(len(lst
)):
min1
=min(lst
[i
:])
ind
= lst
.index
(min1
)
lst
[i
],lst
[ind
]=min1
,lst
[i
]
return lst
print("直接选择排序的结果为:",choice_sort
(lst
))
运行结果为:
3.希尔排序
原理
将序列分组,每次分组的大小为列表长度除2.然后在组内将元素进行直接插入排序
实例
例如:有序列:36 25 48 12 65 25 43 58 76 32
第一次分组并排序后的序列为: 分组(d=5):有5个组,每组的内容为:[36,25],[25,43],[48,58],[12,76],[65,32]
组内直接插入排序后: 25 25 48 12 32 36 43 58 76 65
第二次分组并排序后的序列为: 分组(d=2):有2个组,每组的内容为:[25,48,32,43,76],[25,12,36,58,65]
组内直接插入排序后: 25 12 32 25 43 36 48 58 76 65
第二次分组并排序后的序列为: 分组(d=1):有10个组
组内直接插入排序后: 12 25 25 32 36 43 48 58 65 76
代码
def shell_sort(list):
n
= len(list)
gap
= n
// 2
while gap
> 0:
for i
in range(gap
, n
):
temp
= list[i
]
j
= i
while j
>= gap
and list[j
- gap
] > temp
:
list[j
] = list[j
- gap
]
j
-= gap
list[j
] = temp
gap
= gap
// 2
return list
print("希尔排序后的序列为:",shell_sort
(lst1
))
运行结果为:
4.冒泡排序
原理
用两个for循环,最外层的for循环,用来控制冒泡的次数,里面的for循环,用来控制每一趟冒泡需要比较的次数。
冒泡的次数应该是数组长度-1,每一趟比较的次数是冒泡次数-1
实例
假设有数组:[53,2,6,4,753,23]
第一次冒泡:
用第一个元素53,去和后面所有的元素进行比较,如果前一个数比后一个数大,就进行对换。53>2,将53与2对换、所以第一次冒泡的第一次比较之后数组为[2,53,6,5,753,23],第二次比较53和6,因为53>6,进行对换[2,6,53,5,753,23]… 直到比较到最后一个数,此时的数组为:[2,6,5,53,23,753] 可以看到,冒泡一次之后,数组中最大的元素就已经到最后一个了,依次类推,第二次冒泡就将除最后一个元素之外的最大值放在了倒数第二个
第二次冒泡之后:[2,6,5,23,53,753] 第三次冒泡之后:[2,6,5,23,53,753] 第四次冒泡之后:[2,5,6,23,53,753] 第五次冒泡之后:[2,5,6,23,53,753] 此时已经结束了,因为只需要冒泡n-1次,假设有2个数,则只需要比较1次,就可以得到大小。
代码
def maopao(lst
):
for i
in range(0,len(lst
)-1):
max=lst
[0];
for j
in range(1,len(lst
)-i
):
if max>lst
[j
]:
lst
[j
-1],lst
[j
]=lst
[j
],lst
[j
-1]
max = lst
[j
];
return lst
运行结果为:
5.快速排序
原理
先取左边第一个数作为基准值,用两个指针去记录元素,从最右边的指针开始进行比较,如果值比基准值小,就将其值和左边指针对应的元素进行对换,然后从左边开始进行比较,将元素值大于基准值的元素和右指针对应的元素进行对调,一直到左右指针之间没有元素为止,再将基准值放在两个指针中间,这样进行一趟比较之后,基准值左边的都是比基准值小的序列,右边的都是基准值大的序列
然后对左右序列再进行快排序
代码
def kuaipai(list, left
, right
):
if left
>= right
:
return list
jz
= list[left
]
min = left
max = right
while left
!= right
:
while left
< right
:
if list[right
] >= jz
:
right
-= 1
else:
list[left
] = list[right
]
left
+= 1
list[right
] = list[left
]
list[right
] = jz
kuaipai
(list, min, left
- 1)
kuaipai
(list, left
+ 1, max)
return list
lst
=[13451,24,1234,23,34,43,23]
print(kuaipai
(lst
,0,len(lst
)-1))
运行结果为: