1. 程式人生 > >演算法從排序開始——插入排序(Insertion Sort)C語言及Java實現

演算法從排序開始——插入排序(Insertion Sort)C語言及Java實現

      插入排序的基本思想是,將元素逐個新增到已經排序好的陣列中,同時要求,插入的元素必須在正確的位置,這樣原來排序好的陣列是仍然有序的。具體過程,選擇排序對大小為N的無序陣列ARRAY[N]進行排序,首先將第1個元素作為已經排序好的子陣列,然後將剩餘的N-1個元素,逐個插入到已經排序好子陣列,一共進行N-1輪插入過程。因此,在第 i輪排序時,前i個元素總是有序的,將第i+1個元素插入到正確的位置。

 過程如下



看一下C語言實現

#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;	
	}
}
Java程式碼實現
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函式上面