Python里算法(冒泡 选择 插入 快速)

7 篇文章 0 订阅

//冒泡排序

#!C:\Python27\python.exe  注意:此处是自己电脑上python安装的位置
#-*- coding:utf-8 -*-
__author__ = 'luotianshuai'
import random

maopao_list = [13, 22, 6, 99, 11]
'''
原理分析:
列表中有5个元素两两进行比较,如果左边的值比右边的值大,就用中间值进行循环替换!
既然这样,我们还可以用一个循环把上面的循环进行在次循环,用表达式构造出内部循环!
'''

def handler(array):
    for i in range(len(array)):
        for j in range(len(array)-1-i):
            '''
            这里为什么要减1,我们看下如果里面有5个元素我们需要循环几次?最后一个值和谁对比呢?对吧!所以需要减1
            这里为什么减i?,这个i是循环的下标,如果我们循环了一次之后最后一只值已经是最大的了还有必要再进行一次对比吗?没有必要~
            '''
            print('left:%d' % array[j],'right:%d' % array[j+1])
            if array[j] > array[j+1]:
                tmp = array[j]
                array[j] = array[j+1]
                array[j+1] = tmp



if __name__ == '__main__':
    handler(maopao_list)
    print(maopao_list)

//选择排序

#!C:\Python27\python.exe  注意:此处是自己电脑上python安装的位置
#-*- coding:utf-8 -*-
__author__ = 'luotianshuai'


xuanze_list = [13, 22, 6, 99, 11]

print(range(len(xuanze_list)))

def handler(array):
    for i in range(len(array)):
        '''
        循环整个列表
        '''
        for j in range(i,len(array)):
            '''
            这里的小循环里,循环也是整个列表但是他的起始值是i,当这一个小循环完了之后最前面的肯定是已经排序好的
            第二次的时候这个值是循环的第几次的值比如第二次是1,那么循环的起始值就是array[1]
            '''
            if array[i] > array[j]:
                temp = array[i]
                array[i] = array[j]
                array[j] = temp
        # print(array)


if __name__ == '__main__':
    handler(xuanze_list)
    print(xuanze_list)

//插入排序

#!C:\Python27\python.exe  注意:此处是自己电脑上python安装的位置
#-*- coding:utf-8 -*-
__author__ = 'first'


import random
import time
chaoru_list = [69, 471, 106, 66, 149, 983, 160, 57, 792, 489, 764, 589, 909, 535, 972, 188, 866, 56, 243, 619]

def handler(array):
    for i in range(1,len(array)):
        position = i #刚开始往左边走的第一个位置
        current_val = array[i] #先把当前值存下来
        while position > 0 and current_val < array[position -1]:
            '''
            这里为什么用while循环,咱们在判断左边的值得时候知道他有多少个值吗?不知道,所以用while循环
            什么时候停下来呢?当左边没有值得时候,或者当他大于左边的值得时候!
            '''
            array[position] = array[position - 1] #如果whille条件成立把当前的值替换为他上一个值
            '''
            比如一个列表:
            [3,2,4,1]
            现在循环到 1了,他前面的元素已经循环完了
            [2,3,4] 1

            首先我们记录下当前这个position的值 = 1
            [2,3,4,4] 这样,就出一个位置了
            在对比前面的3,1比3小
            [2,3,3,4] 在替换一下他们的值
             在对比2
            [2,2,3,4]
            最后while不执行了在进行替换'array[position] = current_val  #把值替换'
            '''
            position -= 1
        #当上面的条件都不成立的时候{左边没有值/左边的值不比自己的值小}
        array[position] = current_val  #把值替换


if __name__ == '__main__':
    handler(chaoru_list)
    print(chaoru_list)

'''
    array = []#[69, 471, 106, 66, 149, 983, 160, 57, 792, 489, 764, 589, 909, 535, 972, 188, 866, 56, 243, 619]
    old_time = time.time()
    for i in range(50000):
        array.append(random.randrange(1000000))
    handler(array)
    print(array)
    print('Cost time is :',time.time() - old_time)
'''

//快速排序

#!C:\Python27\python.exe  注意:此处是自己电脑上python安装的位置
#-*- coding:utf-8 -*-
# Author:luotianshuai
import random
import time

def quick_sort(array,start,end):
    if start >= end:
        return
    k = array[start]
    left_flag = start
    right_flag = end
    while left_flag < right_flag:
        '''
        left_flag = start 默认为0
        right_flag = end 默认为传来的列表总长度
        当left_flag 小与right_flag的时候成立,说明左右两边的小旗子还没有碰头(为相同的值)
        '''
        #右边旗子
        while left_flag < right_flag and array[right_flag] > k:#代表要继续往左一移动小旗子
            right_flag -= 1
        '''
        如果上面的循环停止说明找到右边比左边的值小的数了,需要进行替换
        '''
        tmp = array[left_flag]
        array[left_flag] = array[right_flag]
        array[right_flag] = tmp

        #左边旗子
        while left_flag < right_flag and array[left_flag] <= k:
            #如果没有找到比当前的值大的,left_flag 就+=1
            left_flag += 1
        '''
        如果上面的循环停止说明找到当前段左边比右边大的值,进行替换
        '''
        tmp = array[left_flag]
        array[left_flag] = array[right_flag]
        array[right_flag] = tmp

    #进行递归把问题分半
    quick_sort(array,start,left_flag-1)
    quick_sort(array,left_flag+1,end)

if __name__ == '__main__':
    array = []  # [69, 471, 106, 66, 149, 983, 160, 57, 792, 489, 764, 589, 909, 535, 972, 188, 866, 56, 243, 619]
    start_time = time.time()
    for i in range(50000):
        array.append(random.randrange(1000000))
    quick_sort(array,0,len(array)-1)
    end_time = time.time()
    print(array)
    print(start_time,end_time)
    cost_time = end_time - start_time
    print('Cost time is :%d' % cost_time)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值