选择排序法

682 阅读1分钟

对五个数进行从小到大排序(选择排序法)👍

思路:

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。

再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

重复第二步,直到所有元素均排序完毕。

普通做法

#include <stdio.h>

int main()
{
	int min,  t, i, j;
	int a[5] = {9, 8, 7, 6, 5};
	
	for(i = 0; i < 4; i++)        //共五个数,假定前四个数为最小的,剩最后一个就无需比较,也就是比较四轮
	{
		min = i;                    
		for(j = i+1; j<5; j++)   //每轮从假定最小的数的后一个数开始(一直延伸到最后一个),和假定最小的数进行比较
		{
			if(a[min]>a[j])    min = j;
		}
		t = a[i];               //注意是和a[i]交换 
		a[i] = a[min];
		a[min] = t;	
	}
	
	printf("选择法排序后:\n\n");
	for(i = 0; i<5; i++)
	{
		printf("%d ", a[i]);
	}
	
	return 0;
}

分析选择法从小到大:

先假定第一个是最小的,放到一个变量min中,分别与后面的数相比较,找到真正最小的,然后与假定的最小的那个变量交换位置。

再假定第二个是最小的,仍然放到变量min中,分别与后面的数相比较,找到真正最小的,然后与假定的最小的那个变量交换位置。
.
.
.
.
.
.

数组做法

#include <stdio.h>

void sort(int b[]);
/*一维数组作为形参时,可以省略数组名和大小,但是数组类型和元素不能省略*/
#if(0)
void main()
{
	int a[10], i;
	printf("排序前:");
	for(i = 0; i<=9; i++)
	{
		scanf("%d", &a[i]);
	}
	sort(a);
}
void sort(int b[])
{
	int i = 0, j, k, t;
	int min;
	for(j = 0; j<=8; j++)         //控制比较的次数:n个数需比较n-1次 
	{
		min = j;                  //min 的取值:0 ——8 
		for(i = j+1; i<=9; i++)
	    {
		   if(b[i] < b[min])
		   min = i;               //记录最小值的下标 
	    }
	    t = b[j]; b[j] = b[min]; b[min] = t; //将最小值和第一个元素互换 
	}
	printf("排序后:"); 
	for(k = 0; k<=9; k++)
	{
		printf("%2d ", b[k]);
	}
}
#endif

指针做法

#include <stdio.h>

void sort(int * p);

void main()
{
	int a[10], i;
	printf("排序前:");
	for(i = 0; i<=9; i++)
	{
		scanf("%d", &a[i]);
	}
	sort(a);
}
void sort(int * p)
{
	int i = 0, j, k, t;
	int min;
	for(j = 0; j<=8; j++)         //控制比较的次数:n个数需比较n-1次 
	{
		min = j;                  //min 的取值:0 ——8 
		for(i = j+1; i<=9; i++)
	    {
		   if(p[i] < p[min])
		   min = i;               //记录最小值的下标 
	    }
	    t = p[j]; p[j] = p[min]; p[min] = t; //将最小值和第一个元素互换 
	}
	printf("排序后:"); 
	for(k = 0; k<=9; k++)
	{
		printf("%2d ", *(p+k));
	}
}