插入排序
1、直接插入排序
2、折半插入排序
3、希爾排序
1、直接插入排序
package sort;
public class InsertSort {//直接插入排序
//有序區 無序區 [前:後]
public static void sortA(int[] arr,int n){
int tmp;//臨時值
int i,j;
for(i=1;i<n;i++){//保證從小到大
if(arr[i]<arr[i-1])//後一個數 <前一個數
{
tmp=arr[i];//存放那個值
//比較大的數,向右移動
//不可缺少的條件:j>=0
//失敗一:
//for(j=i-1;arr[j]>tmp;j--){
//失敗二:
//for(j=i-1;arr[j]>tmp&&j>=0;j--){
for(j=i-1;j>=0&&arr[j]>tmp;j--){ // i-1 > i
arr[j+1]=arr[j];
}
arr[j+1]=tmp;
}
}
}
public static void main(String[] args) {
int arr[]={4,5,6,3,1,9,0,8,7,2};
System.out.println("排序前:");
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
sortA(arr,arr.length);
System.out.println("\n排序後:");
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
}
}
2、折半插入排序
package sort;
//折半插入排序
public class HalfInsertSort {
// 有序區 無序區 [前:後]
public static void sortA(int[] arr, int n) {
int tmp;// 臨時值
int i, j;
int low, mid, high;// 左邊 中間 右邊
for (i = 1; i < n; i++) {// 保證從小到大
tmp = arr[i];// 存放那個值
// 改進了直接插入排序的插入點位置
// 通過折半查找的方法進行查找插入位置,優化
low = 0;
high = i - 1;
// high = n - 1;//錯誤
while (low <= high) {// 在arr[low .. high] 中折半查找 有序 插入的位置
mid = (low + high) / 2;// 中間位置
if (arr[mid] > tmp) {// 插入位置 在 左半區【左】
high = mid - 1;
} else
low = mid + 1;// 插入位置 在 右半區【右】
}//low>high的時候終止
// System.out.println("low:"+low+"---high:"+high);
//此時,知道了插入的元素位置
//插入位置爲 x=high+1=low
//方法一:
//注意:j=i-1開始,因爲for循環的開始,是1開始
for(j=i-1;j>=high+1;j--){ // i-1 > i
arr[j+1]=arr[j];
}
arr[high+ 1] = tmp;
//將插入位置到待插入元素的位置上的元素整體向後移動一個位置
//方法二:
// for(j = i; j > low; j--) {
// arr[j] = arr[j-1];
// }
// arr[low] = tmp;
}
}
public static void main(String[] args) {
int arr[] = { 4, 5, 6, 3, 1, 9, 0, 8, 7, 2 };
System.out.println("排序前:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
sortA(arr, arr.length);
System.out.println("\n排序後:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}
3、希爾排序
package sort;
//希爾排序 優於 n*n
public class ShellSort {
//直接插入排序 --> 希爾排序
public static void sortA(int[] arr,int n){
int tmp;//臨時值
int i,j;
int gap=n;//間隔
while(gap>1){//gap=1的時候,排序完成
gap=gap/3+1;
//直接插入排序:比較 i 和 i-1
//希爾排序: 比較 i 和 i-gap
for(i=gap;i<n;i++){//保證從小到大
if(arr[i]<arr[i-gap])//後一個數 <前一個數
{
tmp=arr[i];//存放那個值
//比較大的數,向右移動
//直接插入排序:比較 i-1 > i 移動 j--
//希爾排序: 比較 i-gap > i 移動 j=j-gap
for(j=i-gap;j>=0&&arr[j]>tmp;j=j-gap){
arr[j+gap]=arr[j];
}
arr[j+gap]=tmp;
}
}
}
}
public static void main(String[] args) {
int arr[]={4,5,6,3,1,9,0,8,7,2};
System.out.println("排序前:");
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
sortA(arr,arr.length);
System.out.println("\n排序後:");
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
}
}