排序策略
在有序表的恰當處插入乙個新元素,並保持該有序表的有序性
即,當插入第n個元素時,前n-1個元素已經是有序排列
排序過程
以集合中資料為例
①初始儲存
②第一趟(插入38)
③第二趟(插入65)
③第三趟(插入97)
④第四趟(插入76)
⑤第五趟(插入13)
⑥第六趟(插入27)
⑦第七趟(插入49)
一共有八個資料,執行了七次插入操作,即對於長度為n的列,需執行n-1趟
插入資料的過程:
從已排好序的資料尾進行判斷,若要插入的資料小於當前資料,則該資料後移,指標前移,判斷前一位,若要插入的資料大於當前資料,則儲存資料,完成插入
實現**
/**
* 插入排序
* @param list 需要排序的行列
* @return 排序結果
*/public static int insort(int list) else
}//插入資料
list[++index] = add;
}return list;
}
測試結果
時間及空間複雜度
①時間(使用移動次數和比較次數作為衡量標準)
最好,原先序列為正序:比較次數
最壞,原先序列為倒序:比較次數
即平均時間複雜度為:t(n)=o(n2)
②空間在移動時不需要另外訪問儲存空間,所以空間複雜度:
s(n)=o(1)
適用範圍
①n較小
②區域性有序
希爾排序(shell』s sort)又叫「縮小增量排序」,是對直接插入排序所作的改進
排序策略
先將整個待排序的記錄序列分割成為若干個子串行分別進行直接插入排序,待整個序列中的記錄基本有序時,再對全體記錄進行一次直接插入排序
即,對錶中資料進行分組,對每個組進行排序,分組方式:n/(2^i)
排序過程
以集合中的資料為例
①第一趟,d=16/2=8
②第二趟,d=8/2=4
③第三趟,d=4/2=2
④第四趟,d=2/2=1
⑤結果實現**
/**
* 希爾排序
* @param list 需要排序的資料
* @return 排序的結果
*/public static int shesort(int list)
list[j+step] = add;
}//縮小步長,繼續分組
step = step/2;
} return list;
}
測試結果時間及空間複雜度
因為增量d的存在,使記錄不像在直接插入排序中一步步地向前移,而是跳躍式地向前移動,使整個排序的效率得到了改善
①時間(跟步進策略有關)
最好:原先序列為正序,步長d=1,即:t(n) = o(n)
最壞:若步進策略為/2
時,若序列為(k=n/2,n為2的整數冪)時,只有當步長d=1時,才會排序,這時退化為直接插入排序,交換次數為:1+2+…+k-1 = (k*(k-1))/2 = (n*(n-2))/8
即:t(n) = o(n2)
即平均時間複雜度為:t(n) = o(n*log2n)
②空間s(n) = o(1)
③穩定性
不穩定由於shell排序是分組進行排序,它是跳躍式的向前移動,會導致原來在後面的關鍵字移到前面,使兩個相等的關鍵字進行排序後的順序會被改變
插入排序 直接插入 希爾排序
直接插入排序是將元素按順序插入已經排好序的序列中。對於待插入的元素,如果比最後乙個元素還大,則不用處理。否則,從後邊元素開始比較,並順次後移,直到碰到元素小於或者等於該元素。設定第乙個元素位置為哨兵,用來存放待插入元素。include include include using namespace ...
插入排序(直接插入排序 希爾排序)
直接插入排序 基本思想 假設待排序的數存放在陣列arr 1.n 中。初始時,arr 1 自成1個有序區,無序區為arr 2.n 從i 2起直至i n為止,依次將arr i 插入當前的有序區arr 1.i 1 中,生成含n個記錄的有序區。演算法複雜度 對於具有n個記錄的檔案,要進行n 1次排序 各種狀...
插入排序 直接插入排序 希爾排序
1.直接插入排序 兩個陣列,有序陣列和無序陣列。排序前 無序陣列裡面所有的值都是無序的,有序陣列沒有值 排序中 無序陣列中拿出乙個數,放到有序陣列當中,有序陣列拿到數,將其按照大小有序的插入到無序陣列中 排序後 無序陣列中沒有數,有序陣列中的數為有序的。假設有一組無序序列 r0,r1,rn 1。1 ...