1. 程式人生 > 實用技巧 >純手擼——直接插入排序

純手擼——直接插入排序

資料結構複習的最後一章節,給自己個小目標一禮拜內完純手擼完考綱必考排序的程式碼,保持獨立思考。


首先是直接插入排序,順一遍步驟:

  • 假設給定陣列(整型)第一個元素有序
  • 從第二個元素開始,與自己左邊的第一個元素比較,如果比自己小,則不動;如果比自己大,就與自己左邊的第二個元素比較;直到遇到不比自己大的元素,在其右邊插入
  • 選取後面的元素,依次重複第二步
#include<stdio.h>
//後面為了測試寫的輸出,輸出每一次排序後的資訊。這是後面補上的,方便觀察,必須放在InsertSort方法前 
void print(int a[], int n ,int i){
    printf("%d:",i);
    for(int j=0; j<8; j++){ //這裡可自行修改
        printf("%d",a[j]);
    }
    printf("\n");
}

//直接插入排序 
void InsertSort(int a[],int n){ //a為要排序的陣列,n為元素總個數 (即長度)
	for(int i=1;i<n;i++){ //預設第一個元素有序,故i從地址下標1處開始迴圈
		if(a[i]<a[i-1]){ //第i個元素大於i-1元素,不動;反之,要找適當位置插入 
			int j=i-1; //j指向i的左邊第一個元素
			int tmp=a[i]; //臨時儲存待插入元素
			while(j>-1&&tmp<a[j]){ //找要插入的位置 
				a[j+1]=a[j]; //陣列元素後移一個位置,這是為了給待插入元素騰出位置 
				j--; 
			} 
			a[j+1]=tmp; //插入正確的位置,即最後比較不比自己大的元素的右邊 
		}
		print(a,n,i);//列印每次排序後的結果 
	}
}

//測試 
int main(){
	int a[8]={3,1,7,5,2,4,9,6}; //預計 1 2 3 4 5 6 7 8 9
	InsertSort(a,8);
}