二分查找算法与几种排序算法

二分查找

        二分查找只适用于有序的数组(list),每次查找的数据规模都为原来规模的一半,直到找到为止。其时间复杂度为O(logN)。

        假设有一个包含1024个元素的列表,需要从中找到某个元素。对比于简单查找(遍历元素),二分查找最大只需查找10次就可以找到该元素,而简单查找最糟糕情况,则需要1023次才能找到。


下面是二分查找的算法代码:

def sel(lists, item):

    low_index = 0

    high_index = len(lists) - 1

    while low_index <= high_index:

        mid_index = (low_index + high_index) // 2

        if lists[mid_index] == item:

            return mid_index, count

        if lists[mid_index] < item:

            low_index = mid_index + 1

        else:

            high_index = mid_index -1

    return "Nothing"

nl = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

sel(nl, 16)



排序算法

1)冒泡排序

        逐次比较相邻的元素,并做交换,直到排序完成。排序效率不高。

算法代码:

import random

l1 = [random.randrange(11) for i in range(10)]

print("orient num:{}".format(l1))

length = len(l1)

for i in range(length):

    for j in range(length - 1):

        if l1[j] > l1[j + 1]:

            l1[j], l1[j + 1] = l1[j + 1], l1[j]

print(l1)


2)选择排序

2.1 简单选择排序(一元选择排序)

        通过假设0号索引元素为最大值,之后对剩下的元素逐一比较,将最大值的索引赋予一个临时变量。最后判断假设最大值的索引是否改变,若改变则将最大值交换。

算法代码:

import random

l1 = [random.randrange(11) for i in range(10)]

print("orient num:{}".format(l1))

length = len(l1)

for i in range(length):

    tmp_index = i

    for j in range(i+1, length):

        if l1[j] > l1[tmp_index]:

            tmp_index = j

    if tmp_index != i:

        l1[i], l1[tmp_index] = l1[tmp_index], l1[i]

print(l1)


2.2 二元选择排序

    在一元选择排序基础上的改进,二元选择排序是分别固定最大值与最小值到两端。这样排序效率更高。

算法代码:

import random

l = list(range(10))

random.shuffle(l)

length = len(l)

for i in range(length//2):

    count += 1

    maxindex = i

    minindex = -i-1

    minorigin = minindex

    for j in range(i+1, length-i):

        if l[minindex] > l[-j-1]:

            minindex = -j-1

        if l[maxindex] < l[j]:

            maxindex = j

    if i != maxindex:

        l[maxindex], l[i] = l[i], l[maxindex]

        if (i == minindex) or (i == length + minindex):

            minindex = maxindex

        switch += 1

    if minorigin != minindex:

        l[minindex], l[minorigin] = l[minorigin], l[minindex]

        switch += 1

print(l)

print(count, switch)


3)插入排序

        将待排序对象分为两个部分处理,分别是已排序区与未排序区。取未排序元素与已排序的元素作比较,如果未排序元素小于已排序的元素,则将其插入到已排序之后。

        插入排序并不适合用在数据规模很大的对象上,随着已排序部分的规模逐渐增大,其插入一个元素的效率不高(如果使用list),因为索引会逐个调整。而且当内存空间中有大量碎片且需要连续内存空间时,可能会将数据整体迁移到其他连续内存区域。

        此外,通过二分查找可以稍微优惠查找效率。

算法代码:

import random

l = list(range(18))

random.shuffle(l)

zero = [0]

nl = zero + l

print(nl)

length = len(nl)

for i in range(2, length):

    nl[0] = nl[i]

    # print("count:{} {}".format(i-1, nl))

    while i:

        if nl[0] < nl[i-1]:

            # print(nl[i-1],nl[i], end="\t")

            nl[i], nl[i-1] = nl[i-1], nl[0]

            # print(nl[i-1],nl[i], end="\t")

        i -= 1

print(nl[1:])

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容