1. 程式人生 > >十大經典排序之希爾排序與快速排序

十大經典排序之希爾排序與快速排序

希爾排序與插入排序的區別

1.希爾排序沒有插入排序穩定

eg: 

  當陣列為[5,4,6,7,4]時,希爾排序會將第二個4的排序到第一個4之前,所以不穩定,但插入排序不會

2.當希爾排序排到增量為1時,就和插入排序類似

個人理解:巨集觀上希爾排序和插入排序的思想類似

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
'''
希爾排序與插入排序
'''


# One_method 希爾排序
# 1.獲取增量(增量最小為1)
# 2.獲取每個序列的初始索引
# 3.獲取每組序列的元素然後對同一序列中帶插入元素之前的元素進行排序
# def shellInsertSort(arry, l, kd):
#     # 獲取每組的初始值i
#     for i in range(kd):
#         # 獲取每組對應元素的索引
#         for j in range(i + kd, l, kd):
#             # 要插入的元素
#             current = arry[j]
#             # 插入元素的前一個元素的索引
#             one_group = j - kd
#             # 對同一組元素中插入元素之前的元素進行排序
#             while one_group >= i and current < arry[one_group]:
#                 # current > arry[one_group]從大到小
#                 arry[one_group + kd] = arry[one_group]
#                 one_group = one_group - kd
#             else:
#                 arry[one_group + kd] = current

# 獲取增量 直到增量為1
# 增量除以2 每次分kd組
def shellSort(arry):
    l = len(arry)
    kd = l // 2
    while kd >= 1:
        shellInsertSort(arry, l, kd)
        kd = kd // 2
    return arry


if __name__ == '__main__':
    arry = [23, -3, 20, 10, 8, 7, 22]
    print(shellSort(arry))


# Two_method 希爾排序
# 1.獲取每組對應元素的索引
# 2.獲取每組初始化索引
# 3.對每組要插入的元素之前的元素進行排序
def shellInsertSort(arry, l, kd):
    for i in range(kd, l, kd):
        # 待插入的元素
        current = arry[i]
        # 獲取每組初始化索引
        init = i - (i // kd)
        # 對每組要插入的元素之前的元素進行排序
        while i > init and current < arry[i - kd]:
            arry[i] = arry[i - kd]
            i -= kd
        arry[i] = current


# 獲取增量 直到增量為1
# 增量除以2 每次分kd組
def shellSort(arry):
    l = len(arry)
    kd = l // 2
    while kd >= 1:
        shellInsertSort(arry, l, kd)
        kd = kd // 2
    return arry


if __name__ == '__main__':
    arry = [23, -3, 20, 10, 8, 7, 22]
    print(shellSort(arry))

# 插入排序
# 希爾排序中只分一組 增量為 1 這組初始值為0 
# 獲取待插入元素的索引
# 對帶插入元素的索引之前的元素進行排序
def InsertSort(arry):
    l = len(arry)
    for x in range(1, l):
        current = arry[x]
        while x > 0 and current < arry[x - 1]:
            arry[x] = arry[x - 1]
            x -= 1
        arry[x] = current
    return arry


if __name__ == '__main__':
    arry = [23, -3, 20, 10, 8, 7, 22]
    # print(shellSort(arry))
    print(InsertSort(arry))
交流郵箱:[email protected] 

相關推薦

經典排序排序快速排序

希爾排序與插入排序的區別 1.希爾排序沒有插入排序穩定 eg:    當陣列為[5,4,6,7,4]時,希爾排序會將第二個4的排序到第一個4之前,所以不穩定,但插入排序不會 2.當希爾排序排到增量為1時,就和插入排序類似 個人理解:巨集觀上希爾排序和插入排序的思想類

經典演算法排序(三種實現)

希爾排序的實質就是分組插入排序,該方法又稱縮小增量排序,因DL.Shell於1959年提出而得名。 該方法的基本思想是:先將整個待排元素序列分割成若干個子序列(由相隔某個“增量”的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素

(4)排序排序

減少 http 復雜度 需要 ... clas center 記錄 str 轉載:http://www.cnblogs.com/jingmoxukong/p/4303279.html 要點 希爾(Shell)排序又稱為縮小增量排序,它是一種插入排序。它是直接插入排序算法的一

排序排序(JS)

tps 次數 shellSort 轉載 提升 時間復雜度 tar 高效 長大   希爾排序(Shell‘s Sort)是插入排序的一種又稱“縮小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一種更高效的改進版

排序演算法--插入排序排序

希爾排序是對直接插入排序演算法的改進,把整個序列分割為若干子序列,對每個子序列進行直接插入排序,最後對整個序列進行直接插入排序(因為經過前面的子序列排序,整個序列基本有序,最後進行一次直接插入排序效率會比一開始就做排序高)。 如果掌握了直接插入排序,那麼希爾排序也比較容易理解了

常見排序排序

#include <stdio.h>  #include <stdlib.h>  void ShellSort(int a[], int length)  {      int increment; 

python八大排序-----排序

def Shell_sort(L): step = len(L)//2 while step > 0: for i in range(step,len(L)): while(i >= step and L[i

排序排序

#include <iostream> #include <cstdlib> #include <ctime> using namespace std;

排序演算法 插入排序(shell)排序 及其時間複雜度和空間複雜度

        有一個已經有序的資料序列,要求在這個已經排好的資料序列中插入一個數,但要求插入後此資料序列仍然有序,這個時候就要用到一種新的排序方法——插入排序插入排序的基本操作就是將一個數據插入到已經排好序的有序資料中,從而得到一個新的、個數加一的有序資料,演算法適用於少

排序排序(Shell Sort)

希爾排序(Shell Sort):又叫縮小增量排序,該方法是直接插入排序的改進,其實質就是分組直接插入排序; 我們還記得直接插入排序對基本有序的序列排序時,效率很高;由此思想得出希爾排序; 基本思想: 先將待排序序列分成若干個子序列(由相距同等增量的元素組成),然後分別對

冒泡選擇插入歸並快速排序等python實現

python實現 election count partition sub star poi point shell def bubble_sort(a_list): for pass_num in range(len(a_list) - 1, 0, -1):

資料探勘領域經典演算法—CART演算法(附程式碼)

簡介 CART與C4.5類似,是決策樹演算法的一種。此外,常見的決策樹演算法還有ID3,這三者的不同之處在於特徵的劃分: ID3:特徵劃分基於資訊增益 C4.5:特徵劃分基於資訊增益比 CART:特徵劃分基於基尼指數 基本思想 CART假設決策樹是二叉樹,

機器學習經典演算法K-近鄰演算法(學習筆記)

演算法概述 K-近鄰演算法(k-Nearest Neighbor,KNN)是機器學習演算法中最簡單最容易理解的演算法。該演算法的思路是:給定一個訓練資料集,對新的輸入例項,在訓練資料集中找到與該例項最鄰近的K個例項, 這K個例項的多數屬於某個類,就把該輸入例項分

資料探勘領域經典演算法—樸素貝葉斯演算法(超詳細附程式碼)

簡介 NaïveBayes演算法,又叫樸素貝葉斯演算法,樸素:特徵條件獨立;貝葉斯:基於貝葉斯定理。屬於監督學習的生成模型,實現簡單,沒有迭代,並有堅實的數學理論(即貝葉斯定理)作為支撐。在大量樣本下會有較好的表現,不適用於輸入向量的特徵條件有關聯的場景。 基本思想 (1)

資料探勘領域經典演算法—SVM演算法(超詳細附程式碼)

簡介 SVM(Support Vector Machine)中文名為支援向量機,是常見的一種判別方法。在機器學習領域,是一個有監督的學習模型,通常用來進行模式識別、分類以及迴歸分析。 相關概念 分類器:分類器就是給定一個樣本的資料,判定這個樣本屬於哪個類別的演算法。例如在股

機器學習經典演算法決策樹(學習筆記整理)

一、決策樹概述 決策樹是一種樹形結構,其中每個內部節點表示一個屬性上的測試,每個分支代表一個測試輸出,每個葉節點代表一種類別。決策樹是一個預測模型,代表的是物件屬性與物件值之間的一種對映關係。 最初的節點稱為根節點(如圖中的"顏色"),有分支的節點稱為中間節點

資料探勘經典演算法K-means 演算法

K-means演算法(非監督性學習) 1.演算法思想         k-means演算法是一種簡單的迭代型聚類演算法,採用距離作為相似性指標,從而發現給定資料集中的K個類,且每個類的中心是根據類中所有值的均值得到,每個類

資料探勘經典演算法KNN演算法

KNN演算法(監督性學習) 1.演算法思想        KNN是通過測量不同特徵值之間的距離進行分類。它的思路是:如果一個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別,其

資料探勘領域經典演算法—SVM演算法

本文轉自:https://blog.csdn.net/fuqiuai/article/details/79483057 簡介 SVM(Support Vector Machine)中文名為支援向量機,是常見的一種判別方法。在機器學習領域,是一個有監督的學習模型,通常用來

資料探勘領域經典演算法—CART演算法(超詳細附程式碼)

簡介 CART與C4.5類似,是決策樹演算法的一種。此外,常見的決策樹演算法還有ID3,這三者的不同之處在於特徵的劃分: ID3:特徵劃分基於資訊增益 C4.5:特徵劃分基於資訊增益比 CART:特徵劃分基於基尼指數 基本思想 CAR