直接插入排序和選擇排序

2021-08-21 17:51:06 字數 998 閱讀 2301

(一)直接插入排序

思路:(1)用乙個臨時變數存放待排序的數字;

(2)從陣列前依次遍歷找第乙個比待排序數字大的數字的位置;

(3)將從待排序的數字位置開始,到找的要插入的數字的位置之間的數字向後挪一位,最後將待排序數字插入到找到的位置;

**如下:

void insert_sort( int *arr,int len )

}for( int k = i - 1 ;k >= j ;j-- )//將i-j之間的數字向後挪動一位,

arr[j] = tmp ;//在j的位置插入待排序數字

}}

上述**的時間複雜度為o(n^2),如果給出的數字本來就有序,即最好的情況下時間複雜度也為o(n^2),空間複雜度為o(1);

最好情況比如 12345 也是 o(n~2);從前往後找太浪費時間

優化:採取從後往前找比待排序數字小的數字的位置,插入在此數字的後面,在沒有找到之前將數字往後挪動一位;

最好情況 12345 時間複雜度是o(n);空間複雜度 o(1)

**如下:

void insert_sort2(int *arr,int len)

else

}arr[j+1] = tmp;//找到了將tmp插入在其後面

}}

(2)選擇法排序

思路:第1趟,在待排序記錄r[1]~r[n]中選出最小的記錄,將它與r[1]交換;第2趟,在待排序記錄r[2]~r[n]中選出最小的記錄,將它與r[2]交換;以此類推,第i趟在待排序記錄r[i]~r[n]中選出最小的記錄,將它與r[i]交換,使有序序列不斷增長直到全部排序完畢。**如下:

void select_sort(int *arr,int len)

} if(minindex != i)

}}

時間複雜度:最好情況  12345 是o(n^2)  最壞情況  54321 o(n^2) 空間複雜度:o(1)

直接插入排序 VS 選擇排序

for int i 0 i n i swap arr minindex arr i 選擇排序作為最穩定的排序演算法之一,因為無論什麼資料進去都是o n 2 的時間複雜度 無論近似有序還是完全無序 for int i 1 i n i for int j i j 0 arr j 1 arr j j sw...

插入排序 直接插入排序

直接插入排序演算法思想 將整個資料表分成左右兩個子表,其中左子表為有序表,右子表為無序表 整個排序過程就是將右子表中的元素逐個插入到左子表中,直到右子表為空,而左子表成為新的有序表。演算法過程分析 將待排序的元素存放在陣列r n 1 中,在初始狀態下,r 0 為監視哨,r 1 為有序區,r 2 r ...

插入排序 直接插入排序

一.插入排序的基本思想 將乙個記錄插入已排序好的有序表中,從而得到乙個新的記錄數加1的有序表。要點 設立哨兵,作為臨時儲存和判斷陣列邊界之用。所謂的哨兵,就是即將插入的記錄。二.示例 如果碰見相等的元素,會被插到後面,所以,相等元素的前後順序沒有改變,插入排序是穩定的。三.演算法實現 public ...