婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Python排序算法之插入排序及其優化方案詳解

Python排序算法之插入排序及其優化方案詳解

熱門標簽:商家地圖標注海報 孝感營銷電話機器人效果怎么樣 海外網吧地圖標注注冊 南陽打電話機器人 聊城語音外呼系統 打電話機器人營銷 地圖標注自己和別人標注區別 騰訊地圖標注沒法顯示 ai電銷機器人的優勢

一、插入排序

插入排序與我們平時打撲克牌非常相似,將新摸到的牌插入到已有的牌中合適的位置,而已有的牌往往是有序的。

1.1 執行流程

(1)在執行過程中,插入排序會將序列分為2部分,頭部是已經排好序的,尾部是待排序的。
(2)從頭開始掃描每一個元素,每當掃描到一個元素,就將它插入到頭部合適的位置,使得頭部數據依然保持有序

1.2 逆序對

數組 2,3,8,6,1> 的逆序對為:2,1> ❤️,1> 8,1> 8,6> 6,1>,共5個逆序對。
插入排序的時間復雜度與逆序對的數量成正比關系,逆序對的數量越多,插入排序的消耗的時間就越多。
當逆序對的數量極少時,插入排序的效率特別高,甚至速度比 O nlogn 級別的快速排序還要快。

1.3 代碼實現

將一個元素插入到數組有序的前半部分中,那個插入的位置元素一定是比該元素大,而該位置前的元素比該元素小(或者是沒有前一個元素)。所以我們可以通過比較,將該元素進行冒泡:如果前一個元素比我大,則交換位置,否則停止冒泡。

def insertion_sort_ver1(array):
    n=len(array)
    for right in range(1,n):
        cur=right
        while cur>0 and array[cur-1]>array[cur]:
            array[cur-1],array[cur]=array[cur],array[cur-1]
            cur-=1

整體代碼:

import numpy as np
import time

#檢查是否有序
def orderCheck(array):
    for i in range(len(array)-1):
        if array[i]>array[i+1]:
            print('排序失敗')
            return
    print('排序成功')
    
def sort(sort_algorithm,ori_array):
    #先復制一份數組,再進行更改
    array = np.copy(ori_array)
    start=time.clock()
    sort_algorithm(array)
    end=time.clock()
    total_time=float(end-start)
    print(sort_algorithm.__name__+" : %0.5f" % total_time)
    orderCheck(array)

def insertion_sort_ver1(array):
    n=len(array)
    for right in range(1,n):
        cur=right
        while cur>0 and array[cur-1]>array[cur]:
            array[cur-1],array[cur]=array[cur],array[cur-1]
            cur-=1
            
array=np.random.randint(0,10000,2000,dtype=int)
sort(insertion_sort_ver1, array)

消耗時間為0.82632秒。

1.4 優化1

在冒泡中,交換前后cur和cur-1位置兩個元素的位置,需要進行兩次賦值,但如果冒泡仍要繼續,cur-1位置的元素還是會被cur-2位置的元素覆蓋,所以兩次賦值中的一次其實是無意義的,為此我們可以先找到插入位置,然后將后方的元素作統一的移動;或者是在冒泡過程中只進行一次賦值(將前一個元素移動到后方),直到冒泡結束確定插入位置后,再進行待插入元素的插入。

#元素交換作優化
def insertion_sort_ver2(array):
    n=len(array)
    for right in range(1,n):
        cur=right
        elem=array[cur]
        while cur>0 and array[cur-1]>elem:
            array[cur]=array[cur-1]
            cur-=1
        array[cur]=elem

消耗時間為0.45987秒,明顯變快了。

1.5 優化2

之前我們在尋找插入的位置時,采用的是從大到小依次遍歷的方法,因為是在一個有序的數組上尋找插入的位置,我們肯定會想到一種查找的方法:二分查找。通過二分查找,我們可以通過O(logn)級別的比較與O(n)級別的元素移動完成排序任務,而之前我們進行的比較和移動,都是O(n)級別。

1.5.1 普通二分查找

普通的二分查找十分簡單,根據中間位置元素大小更新兩端索引位置即可,在此兩端的索引 [left,right)采用左閉右開的方式,這樣未查找到元素的條件就十分簡單,因為區間左閉右開,當leftright時,表明區間內還有元素,仍舊可以進行查找;否則,區間里沒有元素了,說明元素未查找到,代碼如下。

def binary_search(array,target):#[left,right)左閉右開
    left=0
    right=len(array)
    while leftright:#當leftright,表明區間中還有值,否則哪怕left==right,因right不可取,區間中還是無值
        middle = (left + right) >> 1
        if targetarray[middle]:
            right=middle
        elif array[middle]target:
            left=middle+1
        else:
            return middle
    return -1

1.5.2 二分查找插入位置

查找插入位置的二分查找顯然和普通二分不同,在此我們修改一下左右端點移動的條件與移動方式。在此左右端點依舊左閉右開,如果當array[middle]小于或等于插入元素target,那么顯然middle不可能是插入位置,middle位置的元素也不再需要,left應該為middle+1;而當array[middle]大于target,那么middle有可能是插入的位置(插入位置大于target,前一個元素如果存在,應小于target),應該保留middle,所以right=middle。但是區間是左閉右開,right不可取到,哪怕right=middle,middle不還是無法取得嗎?但由于array[middle]不論取何值(不管是大于、等于、小于),都將導致左右端點left、right的變化,且數組中左右端點代表區間的大小是不斷減小的,最終左右端點重合,此時的位置就是插入的位置。
下面是查找的示例:




代碼如下:

def binary_search(array,index):
    left=0
    right=index
    while leftright:
        middle=(left+right)>>1
        if array[middle]>array[index]:#大于目標,可能是插入的位置,用right保留
            right=middle
        else:#小于等于,不可能是插入位置,更新left為middle+1
            left=middle+1
    return left #最后插入的位置

1.5.3 使用二分的插入排序

找到插入位置后,我們只需移動位置后面的元素,再將元素插入即可。

#利用二分查找找到插入的點,減少了比較的次數
def insertion_sort_ver3(array):
    n=len(array)
    for right in range(1,n):
        index=binary_search(array,right)
        elem=array[right]
        for i in range(right,index,-1):
            array[i]=array[i-1]
        array[index]=elem

可見速度比之前的插入排序仍有提高。

1.6 時間空間復雜度

最壞、平均時間復雜度:O(n^2),最好時間復雜度:O(n),空間復雜度:O(1)。

1.7 穩定性

插入排序將后方的元素從后往前插入,后邊相等的元素將插入在左邊相等元素的右側,沒有改變原有的位置,屬于穩定排序。

到此這篇關于Python排序算法之插入排序及其優化方案詳解的文章就介紹到這了,更多相關Python插入排序內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • python中的插入排序的簡單用法
  • Python實現的插入排序,冒泡排序,快速排序,選擇排序算法示例
  • Python排序搜索基本算法之插入排序實例分析
  • Python實現的插入排序算法原理與用法實例分析
  • 插入排序_Python與PHP的實現版(推薦)
  • Python中使用插入排序算法的簡單分析與代碼示例
  • python插入排序算法的實現代碼
  • python 實現插入排序算法

標簽:揚州 撫州 六盤水 牡丹江 聊城 楊凌 迪慶 南寧

巨人網絡通訊聲明:本文標題《Python排序算法之插入排序及其優化方案詳解》,本文關鍵詞  Python,排序,算法,之,插入,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Python排序算法之插入排序及其優化方案詳解》相關的同類信息!
  • 本頁收集關于Python排序算法之插入排序及其優化方案詳解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产精品久久久久久久久图文区| 五月婷婷久久综合| 欧美在线视频日韩| 国产乱码字幕精品高清av| 亚洲午夜精品网| 国产精品丝袜91| 欧美精品一区二区不卡| 日本福利一区二区| 国产成人在线看| 毛片一区二区三区| 亚洲国产精品嫩草影院| 综合久久一区二区三区| 欧美精彩视频一区二区三区| 日韩美女视频在线| 成人免费黄色大片| 国产乱一区二区| 日本不卡在线视频| 一区二区三区四区高清精品免费观看| 久久精品亚洲精品国产欧美kt∨| 欧美一区二区三区在线| 欧美日韩一本到| 色乱码一区二区三区88| 成人蜜臀av电影| 国产福利一区二区三区视频| 麻豆成人综合网| 热久久一区二区| 天堂午夜影视日韩欧美一区二区| 一片黄亚洲嫩模| 亚洲综合色噜噜狠狠| 亚洲精品免费视频| 一区二区三国产精华液| 亚洲黄网站在线观看| 一区二区三区在线免费播放| 一区二区三区中文在线观看| 亚洲精选免费视频| 亚洲精品你懂的| 一区二区三区四区亚洲| 国产成人在线影院 | 国产午夜精品一区二区三区视频 | 成人免费在线视频| 久久久久综合网| 久久久久久久综合色一本| 久久久噜噜噜久久人人看 | 亚洲免费观看在线视频| 亚洲婷婷在线视频| 一区二区三区成人在线视频| 亚洲成人自拍网| 婷婷久久综合九色国产成人| 琪琪久久久久日韩精品| 国产米奇在线777精品观看| 国产精品亚洲专一区二区三区| 成人在线一区二区三区| 91在线无精精品入口| 精品制服美女丁香| 国产精品久久久久影院亚瑟 | 国产欧美精品区一区二区三区| 国产亚洲一区字幕| 欧美国产精品劲爆| 自拍偷拍亚洲欧美日韩| 午夜视频一区在线观看| 老司机精品视频在线| 国产sm精品调教视频网站| 91色乱码一区二区三区| 欧美日韩第一区日日骚| 精品久久五月天| 中文字幕一区二区三区四区不卡| 一区二区三区 在线观看视频 | 国产精品一区二区久久不卡| 成人美女视频在线看| 欧美在线一区二区| 精品剧情在线观看| 亚洲美女精品一区| 久久精品二区亚洲w码| 99re66热这里只有精品3直播| 欧美老女人在线| 一区二区三区中文字幕精品精品| 精品日韩欧美在线| 久久久91精品国产一区二区三区| 国产精品久久久久久久久晋中 | 欧美日本在线观看| xvideos.蜜桃一区二区| 亚洲男人天堂一区| 久草中文综合在线| 91精品91久久久中77777| 精品久久一区二区三区| 一区二区三区不卡在线观看| 国产在线播放一区二区三区| 色偷偷久久人人79超碰人人澡| 日韩免费福利电影在线观看| 亚洲免费av观看| 国产精品亚洲а∨天堂免在线| 欧美色综合网站| 国产精品久久久久久亚洲毛片 | 色综合中文字幕| 久久亚洲综合av| 三级在线观看一区二区| 91网页版在线| 久久久精品影视| 丝袜国产日韩另类美女| 成人av午夜影院| 日韩欧美aaaaaa| 亚洲成人av免费| 92国产精品观看| 国产欧美视频在线观看| 免费在线观看成人| 99久久精品国产麻豆演员表| 欧美专区亚洲专区| 国产日韩精品视频一区| 免费亚洲电影在线| 欧美日韩久久久一区| 亚洲色欲色欲www| 国产成人精品免费网站| 日韩美女主播在线视频一区二区三区 | 国产精品一区二区你懂的| 5858s免费视频成人| 一二三区精品福利视频| 99视频在线精品| 国产网站一区二区| 精彩视频一区二区三区| 欧美精品日韩精品| 夜夜精品视频一区二区 | 欧美精品v国产精品v日韩精品| 亚洲视频一区在线| 国产精品88888| 欧美精品一区二区在线观看| 日韩精品一二三| 精品视频在线免费看| 亚洲精品国产成人久久av盗摄| 成人国产一区二区三区精品| 久久精品视频网| 国产很黄免费观看久久| 久久精品日韩一区二区三区| 精品一区二区三区在线播放| 亚洲精品一线二线三线| 国产一区在线不卡| 欧美午夜理伦三级在线观看| 国产主播一区二区三区| 欧美亚洲国产一卡| 日韩限制级电影在线观看| 精品一二线国产| 国产高清精品久久久久| 国产亚洲欧美色| 成人精品国产一区二区4080| 日本一区二区三区在线不卡| 成人一二三区视频| 中文字幕色av一区二区三区| 99综合影院在线| 亚洲乱码国产乱码精品精的特点 | 午夜激情一区二区三区| 欧美福利一区二区| 免费看日韩a级影片| 欧美精品一区二区在线观看| 成人性视频免费网站| 日韩美女久久久| 欧美日韩免费观看一区三区| 男男视频亚洲欧美| 日本一区二区三区久久久久久久久不 | 久久国产视频网| 久久亚洲春色中文字幕久久久| 成人激情午夜影院| 一区二区三区欧美| 欧美一区二区精品在线| 国产麻豆一精品一av一免费| 国产精品―色哟哟| 欧美图片一区二区三区| 麻豆精品精品国产自在97香蕉| 久久久久成人黄色影片| 色婷婷av一区二区三区gif| 日韩国产欧美在线视频| 久久综合成人精品亚洲另类欧美 | 岛国精品在线观看| 夜夜嗨av一区二区三区中文字幕 | 国产麻豆成人精品| 欧美日韩国产一区二区三区地区| 日精品一区二区三区| 日韩一区二区不卡| 国产91综合一区在线观看| 玉米视频成人免费看| 欧美成人一区二区三区在线观看 | 日韩精品电影在线| 久久久青草青青国产亚洲免观| 成av人片一区二区| 五月天丁香久久| 欧美激情一区二区三区| 欧美日韩精品一区二区三区| 国产乱国产乱300精品| 一区二区三区日韩欧美精品| 亚洲精品一区二区在线观看| 99久久精品99国产精品| 老司机免费视频一区二区三区| 亚洲欧洲av在线| 欧美成人三级电影在线| 91美女视频网站| 国产一区二区三区免费观看| 欧美精品一区二区在线观看| 国产精品久久久久影院| 亚洲欧美一区二区三区孕妇| 久久99精品国产麻豆婷婷| 亚洲精品在线观看网站| 欧美日韩美少妇|