這個排序看起來比冒泡選擇,插入都難,邏輯複雜一些。
憑直覺啊,就知道這個不簡單,有點怕怕。
沒有辦法,給自己心理一個暗示,一定要看完這8個基本排序演算法的,慢慢來吧。
java代碼實現:
public static void shell_sort(int array[],int lenth){
int temp = 0;
int incre = lenth;
while(true){
incre = incre/2;
for(int k = 0;k<incre;k++){
for(int i=k+incre;i<lenth;i+=incre){
for(int j=i;j>k;j-=incre){
if(array[j]<array[j-incre]){
temp = array[j-incre];
array[j-incre] = array[j];
array[j] = temp;
}
else{
break;
}
}
}
}
}
}
先把代碼拿出來參考吧
整體思想:
在要排序的一組數中,根據某一增量分為若干子序列,並對子序列分別進行插入排序。
然後逐漸將增量減小,並重複上述過程。直至增量為1,此時資料序列基本有序,最後進行插入排序。
不理解,什麼增量,這個概念都不說清楚。那我就自己的理解就是一個數,因為數有大小,那就有增量,增量就是一個數增加了多少。
我自己來說吧:在一個數組中,分組,然後對每一組用插入排序。怎麼分組呢,就是開始對半分,對每一組又對半分就是了。這個就是他說的增量的遞減了,
那最後到一組中只有一個數字了,那就不能分組了。
現在數組基本上九有序了,
最後來一下插入排序
設計步驟:
1.方法接受一個數組,一個length。這個length就是增量了,shell排序,就是增量分割排序。
2.真的不是想放棄的原因,實在是載入代碼到腦子裡可能又造成的短路之類的吧。
這個while(true)我想不到,現在我抄下來又有什麼用,等到我自己寫的時候又想不到,只能靠背誦,肯定背不出來的。之前就背過,腦子一片空
3,根據基本思想來了,在分組中是有一個迴圈分組的思想的,這裡可能要用到了while迴圈的寫法,什麼時候退出,就是這個增量等於一了。
4.增量開始是傳進來的數值,每走一趟迴圈,增量就除2.
5. for(int k = 0;k<incre;k++){
for(int i=k+incre;i<lenth;i+=incre){
for(int j=i;j>k;j-=incre)
這幾個嵌套的迴圈是什麼意思,不懂。
網上的人寫的什麼思路完全用不到,這個我覺得必須要分開一步步,思路都是假的,只有分開一步步,別人按照分開的一步步走下去沒問題才行。我這裡5就卡主了。
有必要說明一下這些個迴圈都是為什麼。為了達到什麼目的。
我自己的思路,是必須迴圈分開的左右兩邊的數組。
還是用數字帶入理解一下了
increae就5
然後length是10
for(int k = 0;k<5;k++){
for(int i=k+5;i<10;i+=5){
for(int j=i;j>k;j-=5)
有理解了:
最外層0到5迴圈,再裡面是5到10一個迴圈。如果變數的換就是一個數組的左右兩邊
然後再裡面一個迴圈是從10到5遞減的判斷一下 array[j]<array[j-incre] 10到5的數字中,後面的比前面小就交換一下,不是就進行下一次比較。
這兩左右兩邊的數組都比較完了。
思想就是,我吧一個數組的左右兩邊的都迴圈一遍。
這個多層迴圈看來還是邏輯太複雜了。
自己還是沒有清楚,FACK