希爾排序及代碼實現
前言:
最近在學習排序,學習到希爾排序的時候對代碼有一些感觸,首先講一下希爾排序是怎麼個排序過程,然後在把我能夠實現的從網上盪來的代碼貼一下,然而這不是完了,我和組長大人在討論一番後,發現這個盪來的代碼是有些小問題的,所以把問題也寫一下。
排序過程:
待排序數組:48, 37 ,64, 96, 75, 12, 26, 48, 54, 03
步驟一:選一個小於n(就是你的數組長度)的數字(比如選5),然後按照這個數來分組,即第一個和隔5個數之後的數字分為一組。在這個例子里:48和隔個5個數的12為一組,因為12後面不夠5個數了,所以這個分組就到這了。
分組情況:
步驟二:將第一開始的分組的數字以直接插入的方式,按照從小到大的排序(也可以按照從大到小來)
12,26,45,54,03,48,37,64,98,75
步驟三:由於第二部進行了排序,在這個基礎上,再一次選一個小於 d1的數字,d2,以這個數字分組,這次以d2=3舉例
因此,第二次的分組情況如下:
步驟四:將剛剛分完組的數字,進行組內排序,還是以直接插入排序,所以排序之後結果是下面的情況:
12,03,45,37,26,48,54,64,75
步驟五:這次還要選一個數字d3作為分組的標準,第一,二兩次分別用的5,3,這次用d3=1。也就是說這次可以直接整體用直接插入排序了。
步驟六:直接插入排序結果為:03,12,26,37,45,48,54,64,75
感想:這個排序很好理解的,我一步一步的說的也很明白(自認為),下面貼出來代碼,湊合著實現一下吧。
[csharp] view plain copy
namespace
希爾排序- {
public
partial
class
Form1 : Form- {
public
Form1()- {
- InitializeComponent();
- }
private
void
button1_Click(object
sender, EventArgs e)- {
int
i;int
temp = 0;int
[] Array = { 48, 37, 64, 96, 75, 12, 26, 33, 54, 03 };for
(int
gap = Array.Length / 3; gap > 0; gap--)//第一重循環,按照gap的大小進行分組- {
for
(i = 0; i < gap; i++)//第二重循環,對所有分組進行排序- {
for
(int
j = i; j < Array.Length; j = j + gap)//第三重循環,組內進行直接插入排序- {
- temp = Array[j];
int
index = j - gap;while
(index >= 0 && Array[index] > temp)- {
- Array[index + gap] = Array[index];
- index = index - gap;
- }
- Array[index + gap] = temp;
- }
- }
- label2.Text = label2.Text + "
" + "第" + i + "次結果"; for
(int
k = 0;k <Array .Length ;k ++)- {
- label2.Text = label2.Text + " " + Array[k];
- }
- }
- }
- }
- }
※大眾點評點餐小程序開發經驗之發布與推廣
※遞歸函數及匿名函數配合內置函數的使用
TAG:程序員小新人學習 |