插入排序
思想:把当前序列分成两部分,左边为有序的(初始大小为1),右边为无序,依次把无序的数据插入到有序序列中
void intsertSort(int[] arr, int n){
for(int i = 1; i < n-1; i++){
int j = i -1;
while(j >= 0 && arr[j] > arr[i]){
arr[j+1] = arr[j];
j--;
}
arr[j+1] = arr[i];
}
}
时间复杂度O(n^2)
希尔排序:
若待排序序列基本有序,则插入排序效率更高
使用分治法,分解成多个小问题,初始规模小,待合成大问题时,已基本有序
package com.algorithm.sort; public class ShellSort implements Sort { @Override public void sort(int[] arr) { // TODO Auto-generated method stub int len = arr.length; int j; for (int d = len/2; d >= 1;d = d/2){ for (int i = d + 1; i < len; i++){ int temp = arr[i]; for (j = i -d; j >= 0 && arr[j] > temp; j = j -d) arr[j + d] = arr[j]; arr[j+d] = temp; } } } public static void main(String[] args){ int[] arr = {1,3,2,6,9,4,5,7,8,56,7,8,9,3}; Sort sort =new ShellSort(); sort.sort(arr); for(int a: arr){ System.out.print(a + " "); } } }
时间复杂度 O(nlogn)