java希爾排序演算法,java希爾排序
原文:java希爾排序演算法 代碼:http://www.zuidaima.com/share/1550463279090688.htm
希爾排序演算法的基本思想是:先取一個小於n的整數d1作為第一個增量,把檔案的全部記錄分成d1個組。所有距離為dl的倍數的記錄放在同一個組中。先在各組內進行直接插人排序;然後,取第二個增量d2<d1重複上述的分組和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有記錄放在同一組中進行直接插入排序為止。該方法實質上是一種分組插入方法。
package com.zuidaima.sort;/***@author www.zuidaima.com**/public class ShellSort { public static <T extends Comparable<? super T>> void shellSort(T[] array, int len) { int d = len; while (d > 1) { d = (d + 1) / 2; for (int i = 0; i < len - d; i++) { if (array[i + d].compareTo(array[i]) < 0) { T temp = array[i + d]; array[i + d] = array[i]; array[i] = temp; } } } } public static void main(String[] args) { Integer[] testArray = {23, 25, 12, 42, 35}; ShellSort.shellSort(testArray, 5); System.out.println("The result is:"); for (Integer item : testArray) { System.out.print(item); System.out.print(' '); } } }
標籤: 演算法 希爾 排序 java sort話題: 語言基礎
對於JAVA希爾排序的問題
你排序給我看看!!!!!
邏輯都錯了!不是代碼的問題。
for(d = src.length/2;d>0; d = d/2)看看這句for迴圈。d = d/2永遠是d的一般,那不就越來越小了!!他怎麼去遍曆數組對比!。這個都是很明顯的問題,你絕對能看的出來。也想的到。但你沒有去研究它吧,一上來就問的?
public class shellsort {
static void sort(int[]a,int dk){
int i,j,temp;
for(i=dk;i<a.length;i++){
if(a[i]<a[i-dk]){
temp=a[i];
a[i]=a[i-dk];
for(j=i;j>0&&temp<a[j-1];j=j-dk){
a[j]=a[j-1];
}
a[j]=temp;
}
}
}
public static void main(String args[]){
int[]a={2,4,1,5,6,8,7};
int w=1;
while(w<=a.length/5){
sort(a,w);
w=w*5+1;
}
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
}
}
java 資料結構 希爾排序 解釋代碼
首先先用網上查來的資料解釋下希爾排序:
先取一個小於n的整數d1作為第一個增量,把檔案的全部記錄分成d1個組。所有距離為dl的倍數的記錄放在同一個組中。先在各組內進行直接插入排序;然後,取第二個增量d2<d1重複上述的分組和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有記錄放在同一組中進行直接插入排序為止。
然後說下希爾排序的實質:該方法實質上是一種分組插入方法。
再說下該排序好處:希爾排序的時間效能優於直接插入排序的原因:
①當檔案初態基本有序時直接插入排序所需的比較和移動次數均較少。
②當n值較小時,n和n2的差別也較小,即直接插入排序的最好時間複雜度O(n)和最壞時間複雜度0(n2)差別不大。
③在希爾排序開始時增量較大,分組較多,每組的記錄數目少,故各組內直接插入較快,後來增量di逐漸縮小,分組數逐漸減少,而各組的記錄數目逐漸增多,但由於已經按di-1作為距離排過序,使檔案較接近於有序狀態,所以新的一趟排序過程也較快。
因此,希爾排序在效率上較直接插人排序有較大的改進。
好了,開始解釋你的代碼。
首先 該代碼是以h的值為分組的。h = h*3 + 1; 和h = (h - 1)/3; 可以使h的值產生不同的值,就可以使數組分成幾組。然後就是在每個組裡進行插入排序方法。隨著h值的越來越小,排序也越來越細緻。當h=1時,就相當於在進行一次徹底插入排序。只不過這是整個隊列已經接近排序後的數組,所以要比直接用插入排序速度快。
這就是該代碼的精髓分析了。
該吃飯了。