/*------------------------------------------------------------------------------------------
选择排序法
排序原理:从第一位开始,和后面逐个进行比较,第一次将第一个元素赋值
给temp,用其和后面元素逐一比较,每次遇到比其小的值,则将其
赋给temp,并记录该元素的下标,直到比较完毕,最终记录的下标
就是最小值元素的下标,然后将其和第一个元素交换,便将最小
值挪到第一位,然后又从第二位开始,同理...直到比较完毕.它
和冒泡排序的不同是冒泡排序在遇到需要交换的位置就直接将
元素进行交换,而选择排序只是记录下需要交换的元素下标而已,
所以当前位得到最值只需进行一次交换.
-------------------------------------------------------------------------------------------*/
选择排序法
排序原理:从第一位开始,和后面逐个进行比较,第一次将第一个元素赋值
给temp,用其和后面元素逐一比较,每次遇到比其小的值,则将其
赋给temp,并记录该元素的下标,直到比较完毕,最终记录的下标
就是最小值元素的下标,然后将其和第一个元素交换,便将最小
值挪到第一位,然后又从第二位开始,同理...直到比较完毕.它
和冒泡排序的不同是冒泡排序在遇到需要交换的位置就直接将
元素进行交换,而选择排序只是记录下需要交换的元素下标而已,
所以当前位得到最值只需进行一次交换.
-------------------------------------------------------------------------------------------*/
#include<stdio.h>
void Select_Sort(int ar[],int len);
int main(void)
{
int i,n;
puts("Input the number of elements to the array:");
scanf("%d",&n);
int ar[n]; //变长数组,编译器需支持C99标准
puts("Input n numbers:");
for(i=0;i<n;i++) //读取数组元素
scanf("%d",&ar[i]);
Select_Sort(ar,n);
printf("ar[%d] = ",n);
for(i=0;i<n;i++) //逐个打印数组元素
printf("%d ",ar[i]);
putchar('\n');
return 0;
}
void Select_Sort(int ar[],int len)//选择排序
{
int i,j,min,temp;
for(i=0;i<len-1;i++)
{
temp=ar[i];
min=i; //将当前位置元素当作最小值元素(其实是要将最小值元素交换到当前)
for(j=i+1;j<len;j++)
{
if(ar[j]<temp) //用ar[i]和后面所有元素逐个比较,找到最小指的下标并记录
{
temp=ar[j]; //下一位小于前一位,则将下一位赋值给temp并继续往右移动比较
min=j; //最小值的下标,赋值给min
}
}
ar[min]=ar[i]; //将最小值元素的和当前元素交换,使得当前元素为其后面所有元素中最小值
ar[i]=temp;
}
}