这个算法的复杂度和冒泡排序相同,相对于冒泡排序,这个算法减少了交换次数。
算法描述:
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);
}
下一篇 排序算法从入门到精通之四--插入排序