數據結構學習(十三)——插入排序

插入排序是簡單排序的一種,其主要是對少許數據進行排序處理,大量數據時沒有優點。插入排序就像打撲克,摸起一張牌看到而後按照手裏的牌的順序位置將此牌再插入到適當位置。是一種先肯定數據,再肯定位置的排序算法。與選擇排序算法不一樣。算法

下面的代碼實現了插入排序的簡單練習。數組

#include <stdio.h>

#define MAXSIZE 50

int *Insert_sort(int *s, int n);

int main(void)
{
	int n, i;
	int s[MAXSIZE+1];		//多1個輔助元素

	printf("插入排序練習\n");
	printf("輸入你想排序的數字個數:");
	scanf("%d", &n);
	getchar();
	printf("請依次輸入待排序數據\n");
	for(i=1; i<n+1; i++)		//元素0做爲輔助元素
	{
		scanf("%d", &s[i]);
	}

	Insert_sort(s, n);
	printf("排序好的數據輸出爲:\n");
	for(i=1; i<n+1; i++)
	{
		printf("%d ", s[i]);
	}
	printf("\n");
}

int *Insert_sort(int *s, int n)
{
	int i,j;

	for(i=2; i<n+1; i++)	//i下標表明選擇的那個待排序的元素
	{
		s[0] = s[i];
		j = i - 1;			//j下標前面那部分表明以排序好那部分
		while(s[0] < s[j])
		{
			s[j+1] = s[j];	//元素後移
			j--;
		}
		s[j+1] = s[0];		//插入元素
	}
}

插入排序主要由兩部分構成,一部分是比較操做,另外一部分是移動操做。進行一次比較的工做量大些,移動工做量小些。

它的開銷也小,只須要一個備用單元,就是程序中的數組下標0的元素。另外還須要兩個輔助變量就是排序常常用到的i和j,對存儲器資源比較緊張的嵌入式系統是適合的。code

另外,插入排序的時間複雜度能夠看出來與數據元素的多少成正比。其時間複雜度爲O(n^2)。插入排序支持靜態排序,也支持動態排序,就跟打撲克摸牌同樣。排序

相關文章
相關標籤/搜索