数据结构学习(十四)——选择排序

前篇的插入排序算法,为了给插入元素空出位置,常常要后移腾出位置而进行大量后移操做,若是是移动数据元素规模大的话,就会耗时下降效率。算法

插入排序操做特色:先肯定排序对象,再肯定插入位置。数组

选择排序操做特色:先肯定排序位置,再肯定排序对象。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

相关文章
相关标签/搜索