这次学习一下选择排序。
首先先从待排序序列中选择一个最小的放在第一个位置,然后再从余下的序列中选择一个次小的放在第二个位置。然后重复的选择下去,直到所有元素排完。
假设有一个序列a【5】={2,1,0,6,4}
我们可以假设最小的值就在a【0】处,这样我们就从a【1…4】中一次从左到右的与假设的最小值比较,如果比假设的值小,那么最小值得下标就更改,最值也更改,直到找到最小值,然后与a【0】交换。
开始:
{【2】,1,0,6,4} 此时下标min = 0;最小值minval =A【0】;
接着在a【1…4】中找比minval小的元素
{2,【1】,0,6,4}此时找到min=1,minval=A【1】;
继续在a【2…4】中找比minval小的元素
{2,1,【0】,6,4} 此时找到min=2,minval=A【2】;
最后继续在a【3..4】中查找,没有比minval更小的元素了,此时第一次查找结束
交换a【2】 与A【0】
这时的序列是这样子:
a【5】={【0】,1,2,6,4}
这是自己写的一段测试代码:
#include<stdio.h>
void select_sort(int A[],int size);//函数声明
int main()
{
int a[13]={3,2,4,0,1,9,6,12,5,7,34,22,11};//初始序列
select_sort(a,13);//调用选择排序函数
int j=0;
while(j<13)//输出排好序的数组
{
printf("%d\n",a[j]);
j++;
}
return 0;
}
void select_sort(int A[],int size)//选择排序
{
int i,j;
for(i = 0;i<size-1;i++)//这里直到size-1就可以了,因为前size-1个排好了,最后一个就在正确位置
{
int min = i;//假设的初始最小值下标 min=i
int minval = A[i];//假设的初始最小值minval为A【i】
for(j = i+1;j<size;j++)//在余下的序列A【i+1...size】中选择最小值
{
if(A[j]<minval)//如果A【j】小于minval
{
min = j;//更改最小值下标
minval=A[j];//更改最小值
}
}
int temp;
temp = A[i];
A[i]=A[min];
A[min]=temp; //交换找到的最小值与初始假设的最小值的位置
}
}