1. 程式人生 > >C程式設計——插入排序

C程式設計——插入排序

1、程式檔案

#include <stdio.h>

// 交換
void mySwap(int *a, int i, int j)
{
	int tmp = a[i];
	a[i] = a[j];
	a[j] = tmp;
}

// 列印
void myPrint(int *a, int len)
{
	int i;
	for (i = 0; i < len; i++)
	{
		printf ("%4d", a[i]);
	}
	printf ("\n");
}

// 插入排序
void mySort(int *a, int len)
{
	int i;
	
	// 在一個已經排好序的數組裡插入新元素
	// 只取數組裡的第一個元素,然後把第二個元素往第一個元素裡面插
	// 從後往前找第一個比它小的元素
	// 一邊迴圈,一邊找位置
	// 元素不符合要求就將其後移
	// 符合要求就不移
	// 先是第一個元素有序,插入後,變成兩個元素有序
	for (i = 1; i < len; i++)
	{
		// 將當前下標為i的陣列元素的值儲存在get裡
		int get = a[i];
		
		// 把get的前一元素通過j儲存下來
		int j = i - 1;
		
		// j >= 0 ==> 防止越界
		
		// 一旦get儲存的值,遇到更小的a[j]就退出
		// 然後在j+1位置處插入get
		// 或者迴圈到陣列首元素/已遍歷其之前的所有元素
		while (j >= 0 && get < a[j]) 
		{
			// 把較大值後移
			// 或者說是把不符合條件的值後移
			// 把比get大的值後移
			// 拿get和a[j]進行比較,只要比get大,就把a[j]後移
			// 移完後空出的位置,插入get
			a[j+1] = a[j];
			j--;
		}
	
	    // a[j]的位置是比get小的位置 
		// 插在其後的位置
		a[j+1] = get;
	}
}

int main()
{
	int a[] = {9,8,7,6,5,4,3,2,1,0};
	int len = sizeof(a)/sizeof(a[0]);
	mySort(a, len);
	myPrint(a, len);
	
	return 0;
}

2、測試結果

[email protected]:/mnt/hgfs/shared-lj# gcc 插入排序study.c 
[email protected]:/mnt/hgfs/shared-lj# ./a.out 
0   1   2   3   4   5   6   7   8   9