您的位置:首页 > 编程语言 > Python开发

几种常用的排序算法(一)--python实现

2017-08-08 23:06 621 查看
1. 选择排序,时间复杂度O(n^2),算法不稳定。

    思路:(1)循环整个数组 arr,选出最大的数,将它放在空数组 new_arr 的第一个位置。

               (2)将刚刚选出的数字从 arr 中去掉。

               (3)循环前两个步骤,直到 arr 中没有数字。

下面我写了两个函数,当然写在一起也是可以的。

# -*- coding:utf-8 -*-
#查找到数组中最大数的下标
def find_biggest(arr):
biggest = arr[0]  #biggest用来储存数组中最大的数
big_index = 0
for i in range(1, len(arr)):
if arr[i] > biggest:
biggest = arr[i]
big_index = i
return big_index

#选择排序 时间复杂度O(n*n)
def select_sort(arr):
new_arr = []
for i in range(0,len(arr)):
temp = find_biggest(arr)
new_arr.append(arr[temp])
arr.pop(temp)
return new_arr

#测试
arr = [0, 1, 3, 5, 8 ,6 ,7, 9]
print(arr[find_biggest(arr)])
print(select_sort(arr))


2. 快速排序,时间复杂度O(n*logn),算法不稳定。

    思路:分而治之,采用递归。 首先在数组中随机选择一个数作为基准(pivot),然后将数组分成两部分,小于基准的为一部分, 

               其余的为另一个部分。然后对形成的两个数组采用相同的办法,直到被分成数组中的元素小于数小于2.

               结束递归的条件,就是数组中的元素数小于2. 

# -*- coding:utf-8 -*-
# 快速排序,分而治之,是为递归
def quick_sort(arr):
if len(arr) < 2:
return arr
else:
pivot = arr[0]
# 列表生成式
small = [ i for i in arr[1:] if i < pivot ]
big = [ i for i in arr[1:] if i > pivot ]
return quick_sort(small) + [pivot] + quick_sort(big)

#测试
arr = [1, 4,7, 2, 5, 8, 3, 6, 9]
print(quick_sort(arr))
3. 冒泡排序,时间复杂度O(n^2),算法稳定。

     思路:将数组第一个元素,与其后所有元素比较,若第一个元素大于后面某个元素,则交换两者,循环一遍找最小的元素且放在               

                了第 一 个位置。

                同样循环比较所有的元素,则排序完成。

# -*- coding:utf-8 -*-
#冒泡排序
def change_sort(arr):
for i in range(len(arr)) :
for j in range(i+1, len(arr)) :
if arr[i] > arr[j]:
temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
return arr

#测试
arr = [1, 4, 7, 2, 5, 8, 3, 6, 9]
print(change_sort(arr))
4.直接插入排序,时间复杂度O(n^2),算法稳定

   思路:在插入新的一个元素时,他前面的元素已经排好序,所以只需要找到他自己的位置插入便可以了。

              在实际操作中,我们将第一个元素作为已经排好序的数组,逐步插入数组中其他的元素。

              首先,总体上要将第二个元素到最后一个元素都插入,所以要有个循环。 然后,在一次循环中要找到插入位置,

              我们将要插入的元素,前一个元素比较,如果小于前一个元素,则将前一个元素后移一位,但是此时不要将要插入

              直接插入,要与在前一个元素比较,循环如此,直到比较到第一个元素,或者要插入的元素大于比较的元素,此时

              将要插入的元素直接插入。

# -*- coding:utf-8 -*-
# 直接插入排序
def insert_sort(arr):
9e34
if len(arr) < 2:
return  arr
for i in range(1, len(arr)):
if arr[i] < arr[i-1]:
temp = arr[i]
j = i - 1
while j >= 0 and temp < arr[j]:
arr[j+1] = arr[j]
j = j - 1
arr[j+1] = temp
return arr

#测试
arr = [1, 4, 7, 2, 5, 8, 3, 6, 9]
print(insert_sort(arr))


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: