插入排序,顧名思義其實現形式是插入.
在整個大小不一的佇列中, 第一次: 從乙個元素開始,將後面相鄰的元素(第二個元素)提取出來,放在乙個變數中暫時儲存,然後和第二個元素前面的那個元素(第乙個元素)做比較,如果比它大,當然就不變動位置;但如果比它小,就將前面那個元素移動到第二個元素的位置,然後將變數的元素插入放在第乙個元素的位置;
第二次: 從第二個元素開始將後面相鄰的元素(第三個元素)提取出來,放在之前那個變數中暫時儲存,然後和第三個元素前面的那個元素(第二個元素)做比較,如果比它小,就將前面那個元素移動到第三個元素的位置, 接著再去對比更前乙個的元素(第乙個元素),如果比它小,就把那更前乙個的元素(第乙個元素)又移動到第二個元素的位置,然後將變數中的元素插入放在第乙個元素的位置. 這樣這三個元素就依次是從小到大的排序.
重複第二次的操作,直到最後,整個插入排序處理結果 -- 佇列是按照從小到大的順序排列的. 複雜度為 o(n^2).
明白了原理就不難實現了,下面用c++當練習實現了:
第一次做的時候,沒多想就這麼做了:
void insertsort()
; int ele; //記錄每次排序時當前的插入值
int length = 9;
cout << "the initial data is: " << endl;
print(values, length);
cout << "------------------------------" << endl;
for(int i=0;i=0;p--)
cout << "the test is: " << endl;
print(values, length);
cout << "------------------------------" << endl;
}} }
cout << "the result is: " << endl;
print(values, length);
cout << "------------------------------" << endl;
}
結果是對的,但是感覺實現過程繁瑣了.
接著看看,將第乙個for迴圈的引數起點換為1,將判斷也精簡到第二個for迴圈裡面, 出來的效果也是對的. 而**的精簡效果也立竿見影.看來不能忽視細節!!
第二次實現改了下變成這樣:
void newinsertsort()
; int ele; //記錄每次排序時當前的插入值
int length = 9;
cout << "the initial data is: " << endl;
print(values, length);
cout << "------------------------------" << endl;
for(int i=1;i0;p--)
cout << "the test is: " << endl;
print(values, length);
cout << "------------------------------" << endl;
} }
cout << "the result is: " << endl;
print(values, length);
cout << "------------------------------" << endl;
}
最後結果是一樣的.
有點感慨,很多人都有這樣的時候, **寫久了容易麻木.而且可能當你身體很累很疲乏的時候就會退而求其次趕緊實現功能算了,不很會想去如何實現精簡高效的**.但其實注重下細節,哪怕乙個引數的改變,也可能帶來截然不同的效果.看來演算法是應該多練習,溫故知新.
C 實現排序演算法之插入排序
include include include using namespace std void print int arr,int len cout endl void insertsort int arr,int len arr j 1 basic void main int len sizeo...
插入排序之折半插入排序(c 實現)
插入排序有直接插入排序,折半插入排序 又叫二分插入排序 鍊錶插入排序,希爾排序等。在排序中屬於穩定排序型別。折半插入排序的演算法思想 1 計算 0 i 1 的中間點,用 i 索引處的元素與中間值進行比較,如果 i 索引處的元素大,說明要插入的這個元素應該在中間值和剛加入i索引之間,反之,就是在剛開始...
排序演算法C 實現之插入排序詳解
將一組無序陣列變為有序 將陣列分為兩部分,有序的部分和無序的部分。每次從無序的部分中選擇乙個元素,將該元素插入有序部分,多次插入後,有序部分的元素越來越多,無序部分的元素越來越少,直到無序部分元素為0。可以看見,每次迭代時,有序部分元素數量加一,無序部分元素數量減一。若有n個元素,那麼要迭代n次。無...