希爾排序是1959 年由d.l.shell 提出來的,相對直接插入排序有較大的改進。希爾排序又叫縮小增量排序
基本思想:
先將整個待排序的記錄序列分割成為若干子串行分別進行直接插入排序,待整個序列中的記錄「基本有序」時,再對全體記錄進行依次直接插入排序。
操作方法:
選擇乙個增量序列t1,t2,…,tk,其中ti>tj,tk=1;
按增量序列個數k,對序列進行k 趟排序;
每趟排序,根據對應的增量ti,將待排序列分割成若干長度為m 的子串行,分別對各子表進行直接插入排序。僅增量因子為1 時,整個序列作為乙個表來處理,表長度即為整個序列的長度。
希爾排序的示例:
演算法實現:
我們簡單處理增量序列:增量序列d = n為要排序數的個數
即:先將要排序的一組記錄按某個增量d(n/2,n為要排序數的個數)分成若干組子串行,每組中記錄的下標相差d.對每組中全部元素進行直接插入排序,然後再用乙個較小的增量(d/2)對它進行分組,在每組中再進行直接插入排序。繼續不斷縮小增量直至為1,最後使用直接插入排序完成排序。
#include #include using namespace std;
void print(int a, int i ,int d)
a[j + d] = temp;
print(a, i, d);
}print(a, i, d);
}}int main();
shell_sort(a,8); //希爾插入排序
return 0;
}
執行結果:
i = 4, d = 4 : 2 1 5 7 3 4 9 6
i = 5, d = 4 : 2 1 5 7 3 4 9 6
i = 6, d = 4 : 2 1 5 7 3 4 9 6
i = 7, d = 4 : 2 1 5 6 3 4 9 7
i = 8, d = 4 : 2 1 5 6 3 4 9 7
i = 2, d = 2 : 2 1 5 6 3 4 9 7
i = 3, d = 2 : 2 1 5 6 3 4 9 7
i = 4, d = 2 : 2 1 3 6 5 4 9 7
i = 5, d = 2 : 2 1 3 4 5 6 9 7
i = 6, d = 2 : 2 1 3 4 5 6 9 7
i = 7, d = 2 : 2 1 3 4 5 6 9 7
i = 8, d = 2 : 2 1 3 4 5 6 9 7
i = 1, d = 1 : 1 2 3 4 5 6 9 7
i = 2, d = 1 : 1 2 3 4 5 6 9 7
i = 3, d = 1 : 1 2 3 4 5 6 9 7
i = 4, d = 1 : 1 2 3 4 5 6 9 7
i = 5, d = 1 : 1 2 3 4 5 6 9 7
i = 6, d = 1 : 1 2 3 4 5 6 9 7
i = 7, d = 1 : 1 2 3 4 5 6 7 9
i = 8, d = 1 : 1 2 3 4 5 6 7 9
排序演算法(二) 希爾排序
主要思想 先將待排序列分割成若干個子串行,在子串行內分別進行直接插入排序,待整個序列基本有序時,再對全體記錄進行直接插入排序。例如 第一趟 d 5,將所有相距為 5 的記錄分為一組,從而將整個序列分割成了 5 個子序列。第二趟 d 2,將所有相距為 2 的記錄分為一組,從而將整個序列分割成了8 個子...
排序演算法(二)希爾排序
希爾排序 shell sort 是插入排序的一種。也稱縮小增量排序,是直接插入排序演算法的一種更高效的改進版本。public static int shellsort int a 希爾排序 時間複雜度 希爾排序的時間複雜度與增量序列的選取有關,例如希爾增量時間複雜度為o n 而hibbard增量的希...
排序演算法 希爾排序
如果乙個排序演算法,每次只把諸專案移動乙個位置,則它的平均執行時間至少要和n2成比例.因為在這個排序演算法執行的過程當中,每個記錄平均都必須遍歷n 3個位置,因此如果要對直接插入排序進行有效的,實質性的改進的話,就要有一種演算法,它可以使記錄做長距離的跳躍,而不是一步一步的挪動.希爾排序也是一種插入...