演算法從排序開始——插入排序(Insertion Sort)C語言及Java實現
阿新 • • 發佈:2019-02-07
插入排序的基本思想是,將元素逐個新增到已經排序好的陣列中,同時要求,插入的元素必須在正確的位置,這樣原來排序好的陣列是仍然有序的。具體過程,選擇排序對大小為N的無序陣列ARRAY[N]進行排序,首先將第1個元素作為已經排序好的子陣列,然後將剩餘的N-1個元素,逐個插入到已經排序好子陣列,一共進行N-1輪插入過程。因此,在第 i輪排序時,前i個元素總是有序的,將第i+1個元素插入到正確的位置。
過程如下
看一下C語言實現
Java程式碼實現#include <stdio.h> #include<stdlib.h> #define N 8 void insertSort(int array[],int len); int main(void){ int array[N]={78, 27, 11, 67, 85, 54, 19, 25}; insertSort(array,N); int j; for(j=0;j<N;j++){ printf("%d",array[j]); printf("\t"); } printf("\n"); return 0; } void insertSort(int array[],int len){ int i; for(i=0;i<len;i++){ int k=i-1; int key=array[i]; while(k>=0 && key<array[k]){ array[k+1]=array[k]; k--; } array[k+1]=key; } }
——————————————————————————————public class Insert { public static void main(String[]args){ int array[]={3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48}; Insert in =new Insert(); in.InsertSort(array); for(int i=0;i<array.length;i++){ System.out.print(array[i]+"\t"); } } void InsertSort(int []arr){ for(int i=0;i<arr.length;i++){ int k=i-1; int key=arr[i]; while(k>-1 && key<arr[k]){ arr[k+1]=arr[k]; k--; } } } }
以下為我在寫C的時候遇到的問題,與插入排序已無關
以前一直寫Java 和Python較多,C寫的較少,這次寫起來頗不順手,以下算是個記錄吧
1.嚓,C裡竟然沒有陣列的length方法,沒辦法只能傳一個length的引數N,另外可以通過使用sizeof(array) / sizeof(array[0])來得到長度,
通常使用時把它定義成一個巨集,#define GET_LENGTH(array,length) {length = (sizeof(array) / sizeof(array[0]));}定義一個帶引數的 巨集,
將陣列長度儲存在變數length中
2.接著嚓,C中竟然無法對陣列初始化。error: variable-sized object may not be initialized,C99中的變長陣列不能被初始化!在Digital Mars C/C++,Pellesc等支援C99中變長陣列的編譯器中都不可能通過編譯,哎,蛋疼只好用 巨集 定義一下了,define一下,爽快沒那麼多標準的困擾了#define N 8
3.最後又報了note: previous implicit declaration of 'insertSort' was here的錯誤,順手查了一下,C和java是不一樣滴,我的main函式剛開始寫在insertSort函式之前了,如果在insertSort函式之前,需要在main前加上insertSort的函式宣告,或者把insertSort函式定義放到main函式上面