日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构与算法day19-希尔排序算法

發布時間:2023/12/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构与算法day19-希尔排序算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
希爾排序:簡單插入排序存在的問題:我們看簡單的插入排序可能存在的問題數組 arr = {2, 3, 4, 5, 6, 1} 這時需插入的數1(最小),這樣的過程是:{2, 3, 4, 5, 6, 6}{2, 3, 4, 5, 5, 6}{2, 3, 4, 4, 5, 6}{2, 3, 3, 4, 5, 6}{2, 2, 3, 4, 5, 6}{1, 2, 3, 4, 5, 6}結論:當需要插入的數是較小的數時,后移的次數明顯增多,對效率有影響。希爾排序介紹:希爾排序是希爾(DonaldShell)于1995年提出的一種排序算法。希爾排序也是一種插入排序,它是簡單插入排序經過改進后一個高效版本,也稱為縮小增量排序。希爾排序法基本思想:希爾排序是記錄按下標的一定增量分組,對每組使用直接插入排序算法排序;隨著增量逐漸減少,每組包含的關鍵字越來越多,當增量減至1時,整個文件恰被分成一組,算法便終止

希爾排序圖解:

希爾排序總結:經過上面的"分組插入排序",整個數組的實現了基本的有序化。此時僅僅需要對以上數組簡單微調,無需大量移動操作即可完成整個數組的排序希爾排序應用實例:有一群牛,考試成績分別為{8, 9, 1, 7, 2, 3, 5, 4, 6, 0},請從小到大排序,請分別使用1)希爾排序時,對有序序列在插入時采用交換法,并測試排序速度2)希爾排序時,對有序序列在插入時采用移動法,并測試排序速度

希爾排序(交換法)笨代碼如下:推導代碼

package sort2;import java.util.Arrays; public class ShellSort {public static void main(String[] args) {// TODO Auto-generated method stubint[] arr = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};shellSort(arr);}// 使用逐步推導的方式編寫希爾排序public static void shellSort(int[] arr) {int temp = 0;// 希爾排序的第1輪排序// 因為第1輪排序,是將10個數據分成了5組--> 10/2for (int i = 5; i < arr.length; i++) {// 遍歷各組中所有的元素(共5組,每組有2個元素),步長為5for (int j = i-5; j >= 0; j -= 5) {// 為什么此處-=5會退出,因為每組數據只有2個數據,比較完就退出了// 如果當前元素大于加上步長后的那個元素,要交換if (arr[j] > arr[j+5]) {temp = arr[j];arr[j] = arr[j+5];arr[j+5] = temp;}}}// 3 5 1 6 0 8 9 4 7 2System.out.println("希爾排序1輪后:"+Arrays.toString(arr));// 希爾排序的第2輪排序// 因為第2輪排序,是將10個數據分成了2組--> 10/5/2for (int i = 2; i < arr.length; i++) {// 此處不斷增量,代表初始最大比較位置不斷變化// 遍歷各組中所有的元素(共2組,每組有5個元素),步長為2// 步長是2,但是要從下標0開始// 第1次 j=2-2,比較的是 arr[0] arr[0+2] 第1組// 第2次 j=3-2,比較的是 arr[1] arr[1+2] 第2組// 第3次 j=4-2,比較的是 arr[2] arr[2+2] 第1組// 第4次 j=5-2,比較的是 arr[3] arr[3+2] 第2組// 第5次 j=6-2,比較的是 arr[4] arr[4+2] 第1組// ....依次類推,將2組中的每組5個元素都分別比較完for (int j = i-2; j >= 0; j -= 2) {// -=2這個步長設置的作用,是分組數據的作用// 遍歷的目的是,當不斷比較的時候,每組中需要比較// 的數據需要每次在當前循環中所有數據進行遍歷比較// 如果當前元素大于加上步長后的那個元素,要交換if (arr[j] > arr[j+2]) {temp = arr[j];arr[j] = arr[j+2];arr[j+2] = temp;}}}// 0 2 1 4 3 5 7 6 9 8System.out.println("希爾排序2輪后:"+Arrays.toString(arr));// 希爾排序的第3輪排序// 因為第3輪排序,是將10個數據分成了1組--> 10/5/2/2for (int i = 1; i < arr.length; i++) {for (int j = i-1; j >= 0; j--) {// 如果當前元素大于加上步長后的那個元素,要交換if (arr[j] > arr[j+1]) {temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9System.out.println("希爾排序3輪后:"+Arrays.toString(arr));} }

希爾排序(交換法)通用代碼如下:速度比移步法慢 本質是分組+冒泡排序

package sort2;import java.util.Arrays; public class ShellSort {public static void main(String[] args) {// TODO Auto-generated method stubint[] arr = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};shellSort(arr);}public static void shellSort(int[] arr) {int temp = 0;int count = 0;// 根據前面的逐步分析,使用循環處理for (int gap = arr.length/2; gap > 0; gap /= 2) {// 此處是分組的作用// 遍歷各組中所有的元素(共gap組,每組有n個元素),步長為gap// 外層for用于遞增找到所有的元素// 內層for用于遞減步長比較所有元素for (int i = gap; i < arr.length; i++) {for (int j = i-gap; j >= 0; j -= gap) {// 如果當前元素大于加上步長后的那個元素,要交換if (arr[j] > arr[j+gap]) {// +gap的目的是為了分組內元素進行比較temp = arr[j];arr[j] = arr[j+gap];arr[j+gap] = temp;}}}System.out.println("希爾排序"+(++count)+"輪后:"+Arrays.toString(arr));}} }

希爾排序(移位法)代碼如下:通用代碼 本質是分組+插入排序

package sort2;import java.util.Arrays; public class ShellSort {public static void main(String[] args) {// TODO Auto-generated method stubint[] arr = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};shellSort(arr);System.out.println(Arrays.toString(arr));}// 使用逐步推導的方式編寫希爾排序// 對交換式的希爾排序進行優化--> 移位法public static void shellSort(int[] arr) {// 增量gap,并逐步縮小增量for (int gap = arr.length/2; gap > 0; gap /= 2) {// 從gap個元素開始,逐個對其所在的組進行直接插入排序for (int i = gap; i < arr.length; i++) {int j = i;int temp = arr[j];if (arr[j] < arr[j-gap]) {while(j - gap >= 0 && temp < arr[j-gap]) {// 為什么此處用temp而不用arr[j]// 移動arr[j] = arr[j-gap];j -= gap;}// 當退出while循環時,就給temp找到插入的位置arr[j] = temp;}}}} }

總結

以上是生活随笔為你收集整理的数据结构与算法day19-希尔排序算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。