數據結構學習(十四)——選擇排序

前篇的插入排序算法,爲了給插入元素空出位置,常常要後移騰出位置而進行大量後移操做,若是是移動數據元素規模大的話,就會耗時下降效率。算法

插入排序操做特色:先肯定排序對象,再肯定插入位置。數組

選擇排序操做特色:先肯定排序位置,再肯定排序對象。code

選擇排序大概流程就是從第一個元素開始,而後與後面的元素依次比較大小,比當前元素小的話就記下當前最小位置,繼續比較,直到這輪比較完畢,這樣就能夠找出這一輪最小的元素,而後把此最小元素放入第一個元素位置。而後從第二個元素開始,繼續上面的操做。最後就能排好序。對象

下面的代碼實現了選擇排序的操做練習。排序

#include <stdio.h>

#define MAXSIZE 50

void Select_sort(int *s, int n);

int main(void)
{
	int n, i;
	int s[MAXSIZE + 1];

	printf("選擇排序練習:\n");
	printf("輸入想輸入數據的個數:");
	scanf("%d", &n);
	getchar();
	printf("依次輸入想輸入的數據\n");
	for(i=1; i<=n; i++)
	{
		scanf("%d", &s[i]);
	}

	Select_sort(s, n);

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

	return 0;
}

void Select_sort(int *s, int n)
{
	int i, j, k;

	for(i=1; i<=n; i++)
	{
		k = i;					//假定當前元素爲最小值
		for(j=i+1; j<=n; j++)	
		{
			if(s[j] < s[k])
			{
				k = j;			//記錄當前最小值的下標
			}
		}
		if(k != i)				//把真正最小元素值放入正確位置
		{
			s[0] = s[k];
			s[k] = s[i];
			s[i] = s[0];
		}
	}
}

選擇排序的時間複雜度也跟數據多少成正比例,因此時間複雜度爲O(n^2)

該算法主要兩部分組成,一種是比較操做,一種是交換操做,進行一次交換操做至關於進行三次移動操做。但工做量仍是比一次比較操做工做量小。該算法主要工做量爲內層循環的比較操做。get

選擇排序也只須要一個備用單元,即數組下標爲0的元素和3個輔助變量i,j,k。io

選擇排序不一樣於插入排序,只能用於靜態排序。class

相關文章
相關標籤/搜索