排序算法从入门到精通之三--选择排序

这个算法的复杂度和冒泡排序相同,相对于冒泡排序,这个算法减少了交换次数。

算法描述:

1.这个算法将待排序的数组分成左右2部分,左部分已经排好的,右部分是尚未排好的。左部分中,其最大的元素(最末的元素)总是小于等于右部分的任意一个元素。一开始,左部分为空,右部分是整个数组,随着排序的继续进行,左部分增加扩大,右部分逐渐减小,直到右部分为空为止。

2. 每趟扫描过程中,检查右部分的所有元素,并找出最小的那个元素。这里右部分第一个元素的下标为i,最后一个元素的下标为len-1。这里并不记录最小的那个元素的值,而是记录其位置min,如果min不是右部分的第一个元素,则将arr[min]与右部分的第一个元素arr[i]交换之。

3. 下面是源代码

#include <stdio.h>
#include <stdlib.h>
#include "sorts.h"

#define SWAP(a,b)	\
{					\
	ELE_TYPE t=a;	\
	a=b;			\
	b=t;			\
}

void select_sort(ELE_TYPE arr[], int len)
{
	int i,j;
	for ( i=0;i<len;i++)
	{
		int min=i;
		for (j=i+1;j<len;j++)
		{
			if (arr[j] < arr[min] )
				min=j;
		}

		if ( i!= min)
			SWAP( arr[i],arr[min])	// call macro SWAP
	}
}

void test_select_sort()
{
	ELE_TYPE arr[] = { 61, 17, 29, 22, 34, 60, 72, 21, 50, 1, 62 };
	int len = (int) sizeof(arr) / sizeof(arr[0]);
	

	printf("original data are:");
	print_array(arr, len);

	select_sort(arr, len);
	printf("The data after sorted are:");
	print_array(arr, len);	
	
}

下一篇 排序算法从入门到精通之四--插入排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值