排序并删除重复元素

#!/usr/bin/python
# -*- coding: UTF-8 -*-

def select_sort(lst):
    left,right = 0,len(lst)
    while left < right:
        p,i = left,left+1
        while i < right:
            if lst[i] == lst[p]: #覆盖重复元素,数组长度减一,即右边界左移一位
                lst[i] = lst[right-1]
                right -= 1
            elif lst[p] > lst[i]: #将p定位到更小的元素
                p = i
                i += 1
            else: 
                i += 1
        if p != left: #将最小值交换到左侧
            lst[p],lst[left] = lst[left],lst[p]
        left += 1 #左边界右移一位
    print lst
    del lst[right:] #删除多余的元素

def insert_sort(lst):
    def insert_pos(x,left,right):
        while left <= right:
            mid = (left + right) // 2
            if lst[mid] > x:
                right = mid - 1
            else:
                left = mid + 1
        return left

    i,right = 1,len(lst)
    while i < right:
        t = lst[i]
        p = insert_pos(t,0,i-1) #寻找插入位置
        if p > 0 and lst[p-1] == t: #覆盖重复元素,数组长度减一
            lst[i] = lst[right-1]
            right -= 1
        else:
            for j in range(i,p,-1): #元素右移,腾出插入位置
                lst[j] = lst[j-1]
            lst[p] = t
            i += 1
    print lst
    del lst[right:] #删除多余的元素

def bubble_sort(lst):
    left,right = 0,len(lst)-1
    while left < right:
        for i in range(right,left,-1):
            if lst[i] == lst[i-1]: #覆盖重复元素,数组长度减一,即右边界左移一位
                lst[i] = lst[right]
                right -= 1
            elif lst[i] < lst[i-1]: #向左冒泡
                lst[i],lst[i-1] = lst[i-1],lst[i]
        left += 1 #左边界右移一位
    print lst
    del lst[right+1:] #删除多余的元素

a = [3,3,1,2,1,4,1,3,5,1]
select_sort(a)
print a

a = [3,3,1,2,1,4,1,3,5,1]
insert_sort(a)
print a

a = [3,3,1,2,1,4,1,3,5,1]
bubble_sort(a)
print a

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值