python实现各种排序算法

复习了一下排序算法,又因为在学习python,所以用python把复习到的排序实现了一下。
一、直接插入排序
直接插入排序,平均时间复杂度为O(n^2),它是在遍历的时候,将已经遍历的数据都排好序,然后将新遍历到的数据插入到适合的位置。`

A = [6,5,3,1,8,7,2,4]
for i in range(1,len(A)):
    j = i-1
    temp = A[i]
    while (j >= 0 and A[j] > temp):
        A[j+1] = A[j]
        j = j - 1
    A[j+1] = temp

print A

二、二分插入排序
二分插入排序是对插入排序的一种改进,在将遍历到的新数据插入已经排好序的数据列表中用二分法使得遍历次数减少,在数据量大的情况下优化比较明显。`

A = [5,2,9,4,7,6,1,3,8]
for i in range(1,len(A)):
    res = A[i]
    left = 0
    right = i - 1
    while(left <= right):
            mid = (left + right) / 2
            if(A[mid] > res):
                right = mid - 1
            else:
                left = mid + 1
    for j in range(i-1,left-1,-1):
            A[j + 1] = A[j]
    A[left] = res

for i in range(len(A)):
    print A[i],`

三、选择排序
选择排序是每次遍历的时候都找到数据中的最小值,然后放到已经排好序的数据中的末尾,其实就是每次从未排序的第一个数start_num开始遍历,将找到的最小值与start_num交换。`

A = [8,5,2,6,9,3,1,4,0,7]

for i in range(len(A)):
    min = A[i]
    flag = i
    for j in range(i,len(A)):
        if(min > A[j]):
            min = A[j]
            flag = j
    A[i],A[flag] = A[flag],A[i]

print A
`

四、希尔排序
希尔排序是自己设置一个增量,我习惯取中值作为增量,通过增量将数据分为n组数据,对这n组数据进行插入排序,之后继续取中值直到增量为1为止。希尔排序在最好情况下时间复杂度可以达到O(nlgn)。`

def ShellSort(list):
    gap = len(list)
    gap = gap / 2
    while(gap >= 1):
        for i in range(gap,len(list)):
            j = i - gap
            temp = list[i]
            while(j >= 0 and temp < list[j]):
                    list[j + gap] = list[j]
                    j = j - gap
            list[j + gap] = temp
        gap = gap / 2


A = [5,2,9,4,7,6,1,3,8]
ShellSort(A)
print A

`

五、快速排序
快速排序,平均时间复杂度为O(NlgN),最坏情况下能达到O(n^2),但是这种情况不常见,快速排序用分治策略把一个序列分为两个子序列。划分序列的时候先把序列中的一个值作为基准,然后把比基准小的都放到左边,比基准大的都放到右边,然后递归的进行划分操作,结束条件是序列的大小是0或者1,这个时候就已经排好序了。`

def partition(list,start_index,end_index):
    flag = list[start_index]
    j = start_index-1
    temp = start_index
    for i in range(start_index+1,end_index+1):
        if list[i] < flag:
            j += 1
            temp = i
            list[j],list[i] = list[i],list[j]
    list[j+1],list[temp] = list[temp],list[j+1]

    return j+1


def quicksort(list,start_index,end_index):
    if(start_index < end_index):
        flag = partition(list, start_index, end_index)
        quicksort(list, start_index, flag - 1)
        quicksort(list, flag + 1, end_index)


A = [5,2,9,4,7,6,1,3,8]
quicksort(A, 0, len(A)-1)
print(A)

`

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值