希爾排序

希爾排序,也稱遞減增量排序算法,是插入排序的一種更高效的改進版本。但希爾排序是非穩(wěn)定排序算法。
希爾排序是基于插入排序的以下兩點性質(zhì)而提出改進方法的:

插入排序在對幾乎已經(jīng)排好序的數(shù)據(jù)操作時,效率高,即可以達(dá)到線性排序的效率;
但插入排序一般來說是低效的,因為插入排序每次只能將數(shù)據(jù)移動一位;

希爾排序的基本思想是:先將整個待排序的記錄序列分割成為若干子序列分別進行直接插入排序,待整個序列中的記錄“基本有序”時,再對全體記錄

算法步驟

  1. 選擇一個增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1;

  2. 按增量序列個數(shù) k,對序列進行 k 趟排序;

  3. 每趟排序,根據(jù)對應(yīng)的增量 ti,將待排序列分割成若干長度為 m 的子序列,分別對各子表進行直接插入排序。僅增量因子為 1 時,整個序列作為一個表來處理,表長度即為整個序列的長度。進行依次直接插入排序。
    注: 每次列排序之后,逆序?qū)Χ荚跍p少

Python

class Solution:
    def MySort(self , arr ):
        # write code here
        n = len(arr)
        # 步長為3
        gap = int(n/3)
        while gap > 0: 
            # 以gap為界限,往后取
            for i in range(gap,n): 
                # 得到第i個
                temp = arr[i] 
                j = i 
                #arr[j-gap] 第i個對應(yīng)的前半部分書元素
                t = arr[j-gap]
                while  j >= gap and t > temp: 
                    # 后面的小,就和前面的交換
                    arr[j] = arr[j-gap] 
                    # 換了以后再去換gap之間的變過的數(shù)
                    j -= gap 
                arr[j] = temp 
            gap = int(gap/3)
        return arr

Java

public class ShellSort implements IArraySort {

    @Override
    public int[] sort(int[] sourceArray) throws Exception {
        // 對 arr 進行拷貝,不改變參數(shù)內(nèi)容
        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);

        int gap = 1;
        while (gap < arr.length/3) {
            gap = gap * 3 + 1;
        }

        while (gap > 0) {
            for (int i = gap; i < arr.length; i++) {
                int tmp = arr[i];
                int j = i - gap;
                while (j >= 0 && arr[j] > tmp) {
                    arr[j + gap] = arr[j];
                    j -= gap;
                }
                arr[j + gap] = tmp;
            }
            gap = (int) Math.floor(gap / 3);
        }

        return arr;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 排序算法-7---希爾排序 概念 希爾排序(Shellsort),也稱遞減增量排序算法,是一種典型的插入排序算法,...
    開了那么閱讀 350評論 0 0
  • Demo_github 希爾排序 希爾排序(Shell Sort)又稱為縮小增量排序,它是一種插入排序。它是直接插...
    SkyMing一C閱讀 1,002評論 0 1
  • 希爾排序是1959年由 D.L.Shell 提出來的,相對直接排序有較大的改進。希爾排序又叫縮小增量排序。 基本思...
    NEXTFIND閱讀 542評論 0 1
  • 希爾排序 希爾排序,也稱遞減增量排序算法,是插入排序的一種更高效的改進版本。但希爾排序是非穩(wěn)定排序算法。 希爾排序...
    besmallw閱讀 712評論 0 1
  • 希爾排序:將無序數(shù)組分割為若干個子序列,子序列不是逐段分割的,而是相隔特定的增量的子序列,對各個子序列進行插入排序...
    BubbleM閱讀 344評論 0 0

友情鏈接更多精彩內(nèi)容