java實現折半直接插入排序

public class BinaryInsertionSort {
    public BinaryInsertionSort(int a[],int length)
    {
        int temp=0;//哨兵
        for(int i=1;i<length;i++)                       //每個元素依次插入排序
        {
            int low=0;
            int high=i-1;
            int j=0;
            temp=a[i];
            while (high>=low)                                   //折半查找要插入的元素的位置。這裏注意取等號
            {
                int m=(high+low)/2;
                if(temp<a[m])
                   high=m-1;
                else if(temp>a[m])
                    low=m+1;
                else
                {
                    high=m;
                    break;
                }
            }

            for(int p=i;p>high+1;p--)                   //移動元素的位置
            {
                a[p]=a[p-1];
            }
           a[high+1]=temp;
        }
    }

    public static void main(String[] args) {
       int a[] = new int[100];
        for (int i = 0; i < a.length; i++)              //產生0-10001的數組
           a[i]=(int)(Math.random()*1000+1);
         //int a[] = {1, 6, 23,21};
        new BinaryInsertionSort(a, a.length);
        for (int i = 0; i < a.length; i++)
            System.out.println(a[i]);
    }
}

折半插入排序算法是一種穩定的排序算法,比直接插入算法明顯減少了關鍵字之間比較的次數,因此速度比直接插入排序算法快,但記錄移動的次數沒有變,所以折半插入排序算法的時間複雜度仍然爲O(n^2),與直接插入排序算法相同。附加空間O(1)。
折半查找只是減少了比較次數,但是元素的移動次數不變,所以時間複雜度爲O(n^2)是正確的!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章