算法六之直接插入排序
生活随笔
收集整理的這篇文章主要介紹了
算法六之直接插入排序
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、直接插入排序基本思想
直接插入排序(straight insertion sort)的做法是:
每次從無序表中取出第一個(gè)元素,把它插入到有序表的合適位置,使有序表仍然有序。
第一趟比較前兩個(gè)數(shù),然后把第二個(gè)數(shù)按大小插入到有序表中; 第二趟把第三個(gè)數(shù)據(jù)與前兩個(gè)數(shù)從后向前掃描,把第三個(gè)數(shù)按大小插入到有序表中;依次進(jìn)行下去,進(jìn)行了(n-1)趟掃描以后就完成了整個(gè)排序過程。
直接插入排序是由兩層嵌套循環(huán)組成的。外層循環(huán)標(biāo)識(shí)并決定待比較的數(shù)值。內(nèi)層循環(huán)為待比較數(shù)值確定其最終位置。直接插入排序是將待比較的數(shù)值與它的前一個(gè)數(shù)值進(jìn)行比較,所以外層循環(huán)是從第二個(gè)數(shù)值開始的。當(dāng)前一數(shù)值比待比較數(shù)值大的情況下繼續(xù)循環(huán)比較,直到找到比待比較數(shù)值小的并將待比較數(shù)值置入其后一位置,結(jié)束該次循環(huán)。
int temp; //臨時(shí)空間,保存要插入的數(shù)據(jù)int j; //臨時(shí)空間,保存當(dāng)前移動(dòng)數(shù)據(jù)的下標(biāo)//從1開始,第一個(gè)元素是有序的for (int i = 1; i < data.length; i++) {//比較插入的數(shù)據(jù)與有序隊(duì)列最后一個(gè)數(shù)據(jù)的大小關(guān)系if (data[i - 1] > data[i]) { temp = data[i]; //保存插入的數(shù)據(jù)data[i] = data[i - 1]; //將有序隊(duì)列的最后一個(gè)數(shù)據(jù)移動(dòng)到插入數(shù)據(jù)的位置//從有序隊(duì)列的倒數(shù)第二個(gè)數(shù)據(jù)開始比較for (j = i - 2; j >= 0 && data[j] > temp; j--) {data[j+1] = data[j]; //這些數(shù)據(jù)大于插入數(shù)據(jù),往后移動(dòng)一個(gè)位置 }data[j+1]=temp; //回填要插入的數(shù)據(jù) }}}
二、算法實(shí)現(xiàn)
public static void insertSort(int[] data) {int temp; //臨時(shí)空間,保存要插入的數(shù)據(jù)int j; //臨時(shí)空間,保存當(dāng)前移動(dòng)數(shù)據(jù)的下標(biāo)//從1開始,第一個(gè)元素是有序的for (int i = 1; i < data.length; i++) {//比較插入的數(shù)據(jù)與有序隊(duì)列最后一個(gè)數(shù)據(jù)的大小關(guān)系if (data[i - 1] > data[i]) { temp = data[i]; //保存插入的數(shù)據(jù)data[i] = data[i - 1]; //將有序隊(duì)列的最后一個(gè)數(shù)據(jù)移動(dòng)到插入數(shù)據(jù)的位置//從有序隊(duì)列的倒數(shù)第二個(gè)數(shù)據(jù)開始比較for (j = i - 2; j >= 0 && data[j] > temp; j--) {data[j+1] = data[j]; //這些數(shù)據(jù)大于插入數(shù)據(jù),往后移動(dòng)一個(gè)位置 }data[j+1]=temp; //回填要插入的數(shù)據(jù) }}}
?
?三、算法復(fù)雜度
? 最好時(shí)間O(n),最壞時(shí)間O(n2),平均時(shí)間O(n2),輔助存儲(chǔ)O(1),穩(wěn)定,大部分已有序時(shí)比較好。
?
總結(jié)
以上是生活随笔為你收集整理的算法六之直接插入排序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深圳欢乐谷9大必玩项目 去深圳欢乐谷玩哪
- 下一篇: Oracle入门(四)之查询基本信息