折半插入排序
@Test
public void test(){
int[] arr = {12,2,6,1,5};
sort(arr);
System.out.println(Arrays.toString(arr));
}
public void sort(int[] arr){
for (int i=1; i<arr.length; i++){
//找到[0,i)之间插入arr[i]的位置
//使用二分查找法
int left = 0;
int right=i-1;
while (left<=right){
int mid = (left + right)/2;
if(arr[i]<=arr[mid]){
right = mid - 1;
}else{
left = mid + 1;
}
}
//在[0,i)插入arr[i]
if(left < i){
int temp = arr[i];
System.arraycopy(arr,left,arr,left+1,i-left);
arr[left] = temp;
}
}
}
快速排序
@Test
public void test(){
int[] arr = {5, 2, 6, 12, 1,7,9};
sort(arr,0, arr.length-1);
System.out.println(Arrays.toString(arr));
}
//将[start+1,end]之间的元素分为两拨,左边的所有元素比arr[start]小,右边的所有元素比arr[start]大
public void sort(int[] arr,int start, int end){
if(start<end){
int stard =arr[start];
int left =start;
int right =end;
while (left<right){
while (arr[right]>=stard&&right>left){
right--;
}
arr[left]=arr[right];
while (arr[left]<=stard&&left<right){
left++;
}
arr[right]=arr[left];
}
arr[left]=stard;
sort(arr,start,left);
sort(arr,left+1,end);
}
}
}