[算法]-排序算法之希爾排序

希爾排序算法思想

  • 希爾排序的實質就是分組插入排序,該方法又稱縮小增量排序.

  • 基本思想是:先將整個待排元素序列分割成若干個子序列(由相隔某個“增量”的元素組成的)分別進行直接插入排序,然后依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。因為直接插入排序在元素基本有序的情況下(接近最好情況),效率是很高的,因此希爾排序在時間效率上比前兩種方法有較大提高。

代碼

要求

對于一個int數組,請編寫一個希爾排序算法,對數組元素排序。
給定一個int數組A及數組的大小n,請返回排序后的數組。保證元素小于等于2000。

測試樣例:

[1,2,3,5,2,3],6
[1,2,2,3,3,5]

程序一(好理解,但是比較麻煩)

class ShellSort {
public:int* shellSort(int* A, int n) {// write code hereif(n<2){return A;}int count = 2, argument; //count:一個子序列中的元素數,argument:增量,也是子序列的數量while(count<=n){argument = n/count;for(int i=0;i<argument;i++){sortArgu(A,n,i,argument); //這里把一次插入排序過程抽出來}count *=2;}return A;}private:void sortArgu(int* A, int n, int begin, int argu){int temp, last, current;  //begin:子序列的起始元素current = begin+argu;// current: 一次插入排序中,當前要排序的元素,也就是無序部分的第一個元素while(current<n){last = current;while(last-argu>=begin){if(A[last]<A[last-argu]){temp = A[last];A[last] = A[last-argu];A[last-argu] = temp;}last -= argu;}current +=argu;}}
};

程序二

class ShellSort {
public:int* shellSort(int* A, int n) {// write code hereif(n<2){return A;}int temp,j;for(int step=n/2; step>0; step/=2){ //這里控制增量,最小值時為1,也就是一次普通的插入排序for(int i=step; i<n; i++){ //重點是在這里!!!這里是對第一個增量后的元素進行插入排序(插入排序時起始有序序列為1),沒有把一個子序列單獨抽出來進行排序(區別程序一),而是依次對第一個增量后的元素在其所屬的子序列中進行插入排序for(j=i; j>=step; j-=step){if(A[j]<A[j-step]){temp = A[j];   //這里還可以進一步優化,詳見程序三A[j] = A[j-step];A[j-step] = temp;}else{break;}}} }return A;}};

程序三

class ShellSort {
public:int* shellSort(int* A, int n) {// write code hereif(n<2){return A;}int temp,j;for(int step=n/2; step>0; step/=2){for(int i=step; i<n; i++){   //思想:找到待排序元素在有序部分的位置,然后插入,而不是每一次都把待排序元素與前一個元素交換位置。temp = A[i];     //記錄下待排序元素for(j=i; j>=step; j-=step){if(temp<A[j-step]){  //有序部分的每一個元素都與待排序元素比較A[j]=A[j-step];  //滿足上述條件,則元素后移}else{break;}}A[j]=temp;  //將待排序元素插入合適位置} }return A;}};

參考

1 白話經典算法系列之三 希爾排序的實現

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/397699.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397699.shtml
英文地址,請注明出處:http://en.pswp.cn/news/397699.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python tkinter button顏色變不了_tkinter多按鈕顏色變化

我使用tkinter創建一個8x8按鈕矩陣&#xff0c;當按下單個按鈕時&#xff0c;它會添加到最終列表中(例如finalList((0,0)&#xff0c;(5,7)&#xff0c;(6,6)&#xff0c;…)&#xff0c;允許我快速創建8x8(x&#xff0c;y)坐標圖像。我已經創建了一個帶有按鈕的窗口&#xff0…

應用spss可靠性分析軟件

問卷調查的可靠性分析 一、概念&#xff1a; 信度是指依據測驗工具所得到的結果的一致性或穩定性&#xff0c;反映被測特征真實程度的指標。一般而言&#xff0c;兩次或兩個測驗的結果愈是一致。則誤差愈小&#xff0c;所得的信度愈高&#xff0c;它具有下面特性&#xff1a;1、…

springmvc中的單例問題

1&#xff0c;springmvc實際上是基于一個叫做DispatcherServlet的servlet的。servlet按照以往的學習經驗&#xff0c;他是單事例多線程的。 Servlet生命周期 1.裝載Servlet。這項操作一般是動態執行的。然而&#xff0c;Server通常會提供一個管理的選項&#xff0c;用于在Serve…

設計模式 -- 亨元模式(FlyWeight Pattern)

用來盡可能減少內存使用量&#xff0c;適用于存在大量重復對象的場景&#xff0c;達到對象共享&#xff0c;避免創建過多對象的效果&#xff0c;提升性能&#xff0c;避免內存溢出。 定義&#xff1a; 使用共享對象有效支持大量細粒度對象。 適用場景&#xff1a; 系統中存在大…

python3.6使用mysql_Python之——Python3.6連接MySQL

只安裝了Python是不能連接數據庫的&#xff0c;還要安裝Python連接MySQL的相關類庫&#xff0c;Python2.7連接MySQL的類庫很多&#xff0c;MySQL官方最新支持的Python為Python3.4.&#xff0c;如下圖所示&#xff1a;那么&#xff0c;在Python3.6上如何實現連接MySQL的功能呢&a…

android解析json

android2.3提供的json解析類 android的json解析部分都在包org.json下&#xff0c;主要有以下幾個類&#xff1a; JSONObject&#xff1a;可以看作是一個json對象 JSONStringer&#xff1a;json文本構建類 JSONArray&#xff1a;可以看作是json的數組 JSONTokener&#xff1a;js…

MVVM模式于MVP模式

MVC、MVP、MVVM這些模式是為了解決開發過程中的實際問題而提出來的&#xff0c;目前作為主流的幾種架構模式而被廣泛使用。 一.MVP模式(Model-View-Presenter):傳統的開發是MVP模式(例如jquery) MVP是把MVC中的Controller換成了Presenter&#xff08;呈現&#xff09;&#xff…

HUNAN 11560 Yangyang loves AC(二分+貪心)

http://acm.hunnu.edu.cn/online/?actionproblem&typeshow&id11560&courseid0 題意&#xff1a;總共有n天,每天yangyang都需要一個快樂值,有m個隊友,每個隊友都會給陽陽一個快樂值(為2的冪),并且只能給一次,如果某一天隊友給的快樂值達到yangyang需要的快樂值那么…

BrowserSync開發利器

2019獨角獸企業重金招聘Python工程師標準>>> 大大節省開發時間。安裝使用簡單。使用步驟&#xff1a; 1、nodejs環境 安裝 2、在項目中使用npm安裝到本項目 3、對要監聽的文件執行響應命令 官網更詳細&#xff1a;http://www.browsersync.cn/#install 原理&#xf…

python字符串解析_Python-字符串解析-正則-re

正則表達式特殊字符序列&#xff0c;匹配檢索和替換文本普通字符 特殊字符 數量&#xff0c;普通字符用來定邊界更改字符思路字符串函數 > 正則 > for循環元字符  匹配一個字符# 元字符大寫&#xff0c;一般都是取小寫的反1. 0~9 整數          \d    …

algorithm -- 選擇排序

選擇排序是《導論》第一章課后習題&#xff0c;仿照插入排序&#xff0c;再次運用循環不變式來證明下算法的正確性&#xff0c;C 源碼&#xff1a; // 交換函數 void swap( int& a, int& b ) {a a^b;b a^b;a a^b; } void selectSort( int *arr, int count ) {if( a…

OD 完美走位

題目描述&#xff1a; 在第一人稱射擊游戲中&#xff0c;玩家通過鍵盤的A、S、D、W四個按鍵控制游戲人物分別向左、向后、向右、向前進行移動&#xff0c;從而完成走位。假設玩家每按動一次鍵盤&#xff0c;游戲人物會向某個方向移動一步&#xff0c;如果玩家在操作一定次數的鍵…

layui upload 后臺獲取不到值

后臺獲取不到值方法一&#xff1a; <script>layui.use(upload, function () {var upload layui.upload;//執行實例var uploadInst upload.render({elem: #test1 //綁定元素, url: /Home/UploadFiles //上傳接口, field: "fileNames" //添加這個屬性與后臺…

ueeditor無法上傳圖片_百度ue文本編輯器開發中無法上傳圖片

第一次發文&#xff0c;好緊張呀&#xff0c;不知道會不會沒人看。之前用ue遇到了一些坑&#xff0c;沒人看就當自己記錄了筆記。第一次用&#xff0c;總是會遇到問題&#xff0c;可以先查看下百度ue的演示http://ueditor.baidu.com/website/onlinedemo.html和API http://fex.b…

SQL 語句優化--IN語句優化案例

為什么80%的碼農都做不了架構師&#xff1f;>>> 今天客戶系統升級&#xff0c;通過DMVs性能分析查了一下&#xff0c;升級后發現一個語句執行時間比較長&#xff0c;執行語句要好幾秒鐘&#xff0c;調出語句如下&#xff1a; select distinct field003 from ufi2j0…

Activity跳轉

本例中MainActivity為&#xff1a;FirstActivity.java FirstActivity如下&#xff1a; package com.wyl.intentmultiactivitytest;import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.Vie…

Java課程設計---項目數據庫設計(含實體類)

1、數據庫分析設計 將數據庫命名為&#xff1a;db_student 分析系統中各角色之間的關系 2、表設計 &#xff08;1&#xff09;新建表tb_student&#xff08;學生表&#xff09; &#xff08;2&#xff09;新建表tb_admin&#xff08;管理員表&#xff09; &#xff08;3&#x…

java)_Java NIO系列教程(一) Java NIO 概述

原文鏈接 作者&#xff1a;Jakob Jenkov 譯者&#xff1a;airu 校對&#xff1a;丁一Java NIO 由以下幾個核心部分組成&#xff1a;ChannelsBuffersSelectors雖然Java NIO 中除此之外還有很多類和組件&#xff0c;但在我看來&#xff0c;Channel&#xff0c;Buffer…

本地讀取服務器Xml文件及本地讀本地的xml

updateUrl"ServerUrl"(服務器路徑) WebClient wc new WebClient(); Stream stream wc.OpenRead(updateUrl); XmlDocument xmlDoc new XmlDocument(); xmlDoc.Load(stream); XmlNode list xmlDoc.SelectSingleNode("Update"); foreach (XmlNode node in…

Context.getExternalFilesDir()和Context.getExternalCacheDir()方法

2019獨角獸企業重金招聘Python工程師標準>>> Context.getExternalCacheDir()方法可以獲取到 SDCard/Android/data/你的應用包名/cache/目錄&#xff0c;一般存放臨時緩存數據如果使用上面的方法&#xff0c;當你的應用在被用戶卸載后&#xff0c;SDCard/Android/dat…