java實現---插入排序----直接插入排序和希爾排序
阿新 • • 發佈:2019-01-01
插入排序
直接插入排序
- 直接插入排序,把待排序的元素插入到前面排好序的一組元素的合適位置上去
- 在前面已經排好序的元素中,從後往前找
public class Sort { public static void InsertSort(int arr[]){ int i,j,key; for(i = 1;i < arr.length;i++){ key = arr[i]; //把要排的元素標記出來 for(j = i-1;j >= 0;j--){ //從後往前找合適自己的位置 if(key > arr[j]){ break; }else{ arr[j+1] = arr[j]; } } arr[j+1] = key; } } public static void print(int arr[]){ int i = 0; for(i = 0;i < arr.length;i++){ System.out.println(arr[i]); } } public static void main(String[] args) { int []arr = new int[]{3,2,5,7,6,1}; InsertSort(arr); print(arr); } }
希爾排序
- 希爾排序是先對整組元素進行預排序,使其序列先儘可能有序,再進行插入排序
- 把一整組序列先進行小的分組,把小組裡面的元素排好序後,再統一進行排序,這樣,速度就更快一些。
- 分組策略:
- 1.間隔越大,排序次數少
2.間隔越小,最終的結果越接近有序 - 根據size選擇間隔gap(gap = gap /3 +1)(這是一個公式)
public static void _InsertSort(int arr[],int gap){ int key; int i, j; for (i = gap; i < arr.length; i++){ key = arr[i]; for (j = i - gap; j >= 0; j-=gap){ if (key >= arr[j]){ break; } else{ arr[j + gap] = arr[j]; } } arr[j + gap] = key; } } public static void ShellSort(int arr[]){ int gap = arr.length; while(true){ gap = gap/3+1; _InsertSort(arr,gap); if(gap==1){ break; } } }