摘要:概述希爾排序的誕生是由于插入排序在處理大規(guī)模數(shù)組的時(shí)候會(huì)遇到需要移動(dòng)太多元素的問(wèn)題,也稱遞減增量排序算法。希爾排序的思想是將一個(gè)大的數(shù)組分而治之,劃分為若干個(gè)小的數(shù)組,然后分別對(duì)劃分出來(lái)的數(shù)組進(jìn)行插入排序。
概述
希爾排序的誕生是由于插入排序在處理大規(guī)模數(shù)組的時(shí)候會(huì)遇到需要移動(dòng)太多元素的問(wèn)題,也稱遞減增量排序算法。希爾排序的思想是將一個(gè)大的數(shù)組“分而治之”,劃分為若干個(gè)小的數(shù)組,然后分別對(duì)劃分出來(lái)的數(shù)組進(jìn)行插入排序。
希爾排序是基于插入排序的以下兩點(diǎn)性質(zhì)而提出改進(jìn)方法的:
插入排序在對(duì)幾乎已經(jīng)排好序的數(shù)據(jù)操作時(shí), 效率高, 即可以達(dá)到線性排序的效率
但插入排序一般來(lái)說(shuō)是低效的, 因?yàn)椴迦肱判蛎看沃荒軐?shù)據(jù)移動(dòng)一位
效果示意圖:
至于如何提高效率的,我們還是看下面的實(shí)例吧。
步驟取增量,一般取數(shù)組長(zhǎng)度/2
按增量取得一個(gè)子數(shù)列,對(duì)子數(shù)列按插入排序的方式處理
將增量遞減,重復(fù)1,2步驟
直至增量為為0,數(shù)列已經(jīng)排好序
實(shí)例原始數(shù)據(jù):
3 5 2 6 2
取5/2=2作為增量,對(duì)[3 2 2]進(jìn)行插入排序,得到
2 5 2 6 3
增量遞減2/2=1,對(duì)[2 5 2 6 3]進(jìn)行插入排序,得到
2 2 3 5 6
增量遞減為0,排序結(jié)束。
代碼實(shí)現(xiàn)(Java)package com.coder4j.main.arithmetic.sorting; public class Shell { /** * 希爾排序 * * @param array * @return */ public static int[] sort(int[] array) { int step = array.length / 2; while (step >= 1) { for (int i = step; i < array.length; i++) { int temp = array[i]; int j; for (j = i - step; j >= 0 && temp < array[j]; j-=step) { array[j + step] = array[j]; } array[j + step] = temp; } System.out.println("增量為:" + step + ",結(jié)果:"); for (int k : array) { System.out.print(k + " "); } System.out.println(); step /= 2; } return array; } public static void main(String[] args) { int[] array = { 3, 5, 2, 6, 2 }; int[] sorted = sort(array); System.out.println("最終結(jié)果"); for (int i : sorted) { System.out.print(i + " "); } } }
測(cè)試輸出結(jié)果:
增量為:2,結(jié)果: 2 5 2 6 3 增量為:1,結(jié)果: 2 2 3 5 6 最終結(jié)果 2 2 3 5 6
經(jīng)測(cè)試,與實(shí)例中結(jié)果一致。
希爾與插入對(duì)比希爾是插入的改進(jìn)優(yōu)化,到底能否提高效率呢,我們作一下小測(cè)試。
分別對(duì)[1 2 3 4] 和 [4 3 2 1] 進(jìn)行兩種算法的排序操作,看移動(dòng)的次數(shù)。
比較代碼:
package com.coder4j.main.arithmetic.sorting; public class ShellVSInsert { /** * 插入排序 * * @param array * @return */ public static int[] insert(int[] array) { // 記錄移動(dòng)次數(shù) int count = 0; for (int i = 1; i < array.length; i++) { int temp = array[i]; int j; for (j = i - 1; j >= 0 && temp < array[j]; j--) { array[j + 1] = array[j]; count++; } array[j + 1] = temp; } System.out.println("插入排序移動(dòng)次數(shù):" + count); for (int k : array) { System.out.print(k + " "); } System.out.println(); return array; } /** * 希爾排序 * * @param array * @return */ public static int[] shell(int[] array) { // 記錄移動(dòng)次數(shù) int count = 0; int step = array.length / 2; while (step >= 1) { for (int i = step; i < array.length; i++) { int temp = array[i]; int j; for (j = i - step; j >= 0 && temp < array[j]; j = j - step) { array[j + step] = array[j]; count++; } array[j + step] = temp; } step /= 2; } System.out.println("希爾排序移動(dòng)次數(shù):" + count); for (int k : array) { System.out.print(k + " "); } System.out.println(); return array; } public static void main(String[] args) { int[] array1 = { 1, 2, 3, 4 }; insert(array1); int[] array2 = { 1, 2, 3, 4 }; shell(array2); int [] array3 = { 4, 3, 2, 1 }; insert(array3); int [] array4 = { 4, 3, 2, 1 }; shell(array4); } }
對(duì)比了兩種極端情況,結(jié)果如下:
插入排序移動(dòng)次數(shù):0 1 2 3 4 希爾排序移動(dòng)次數(shù):0 1 2 3 4 插入排序移動(dòng)次數(shù):6 1 2 3 4 希爾排序移動(dòng)次數(shù):4 1 2 3 4
可見(jiàn)希爾排序在有些時(shí)候可以減少移動(dòng)次數(shù)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/65416.html
摘要:這時(shí)就用簡(jiǎn)單插入排序?qū)?shù)列直至已序從直觀上看希爾排序就是把數(shù)列進(jìn)行分組不停使用插入排序,直至從宏觀上看起來(lái)有序,最后插入排序起來(lái)就容易了無(wú)須多次移位或交換。 一、希爾排序介紹 來(lái)源百度百科: 希爾排序(Shells Sort)是插入排序的一種又稱縮小增量排序(Diminishing Increment Sort),是直接插入排序算法的一種更高效的改進(jìn)版本。希爾排序是非穩(wěn)定排序算法。該方...
希爾排序 在介紹希爾排序之前,先了解一下直接插入排序 文章目錄 希爾排序一、直接插入排序1. 單趟排序2. 直接插入排序 二、希爾排序三、測(cè)試希爾排序和直接插入排序性能 一、直接插入排序 1. 單趟排序 x插入一個(gè)有序區(qū)間 這里end是指向數(shù)組最后一個(gè)元素 2. 直接插入排序 根據(jù)上面的單趟排序啟發(fā) end是數(shù)組的最后一個(gè)元素,end之后的元素都是待排序 一個(gè)關(guān)鍵的判斷點(diǎn),end和...
摘要:常見(jiàn)的內(nèi)部排序算法有插入排序希爾排序選擇排序冒泡排序歸并排序快速排序堆排序基數(shù)排序等。這里主要介紹希爾排序。一圖勝千言算法介紹算法描述希爾排序,也稱遞減增量排序算法,是插入排序的一種更高效的改進(jìn)版本。但希爾排序是非穩(wěn)定排序算法。 常見(jiàn)的內(nèi)部排序算法有:插入排序、希爾排序、選擇排序、冒泡排序、歸并排序、快速排序、堆排序、基數(shù)排序等。這里主要介紹希爾排序。 一圖勝千言: showImg(h...
摘要:動(dòng)態(tài)定義間隔序列參考來(lái)源詳細(xì)介紹了十種算法大家可以去學(xué)習(xí)下以后大概會(huì)盡量每天更新一個(gè)算法學(xué)習(xí)吧溫故而知新 參考書(shū):嚴(yán)蔚敏-數(shù)據(jù)結(jié)構(gòu) 希爾排序(Shells Sort) 希爾排序又稱縮小增量排序,歸屬于插入排序一類(lèi),簡(jiǎn)單來(lái)說(shuō),和我們的插入排序比,它更快. 奇妙的記憶點(diǎn): 內(nèi)排序(內(nèi)存排序就夠了) 不穩(wěn)定(排序后原始順序無(wú)法保證) 希爾排序重點(diǎn)在于分割. 基本思想: 將整個(gè)待排序記錄序...
閱讀 2675·2021-11-25 09:43
閱讀 2587·2021-11-22 09:34
閱讀 2856·2021-11-12 10:34
閱讀 1442·2021-10-20 13:46
閱讀 2307·2019-08-30 13:21
閱讀 935·2019-08-30 11:21
閱讀 488·2019-08-30 11:20
閱讀 2192·2019-08-29 17:20