(1)思路:(假如升序排序)把第一个元素设为基准元素,遍历剩余未排元素,如果未排元素random<基准元素base,则二者换位。此时ramdom作为当前min,继续遍历未与base比较过的元素,与min进行比较与交换。即找到最终的MIN并置首位。同样的方法进行第二轮排序,第二位元素作为基准元素,寻找剩余元素的MIN,并换位排在第二位继续遍历、比较、交换.....即不断寻找未排元素的最小值,并依次排序。
(2)重点:for循环是重点。假设有n位数据,arr[i]作为基准元素,0≤i≤n-1;i不断后移,最远到达倒数第二位。arr[j]作为未排序元素,要不断后移遍历并与arr[i]比较。因此一开始比较,arr[j]总是在arr[i]的下一位,即n+1≤j≤n。j随着i变换,因此i在外层循环,j在内层。
(3)特点:运行时间与输入无关(有序无序)、数据移动次数少,不稳定(遇相同元素,会破坏结构)
//选择排序
void sort_func2(int *arr,int length)
{
for(int i = 1; i<length; i++)//i代表轮次,跟基准元素有关
{
for(int j = i; j<length; j++)
{
if(arr[i-1]>arr[j])
{
int temp = arr[i-1];
arr[i-1] = arr[j];
arr[j] = temp;
//break;
}
}
}
}
int main()
{
int arr[8] = {9,3,1,5,8,2,2,6};
//strlen只能计算字符串的长度
//char *str = "wdxwqfefe5";
//printf("strlen=%d\n",strlen((const char *)arr));
//printf("strlen=%d\n",sizeof(arr)/sizeof(int));
//printf("strlen=%d\n",strlen(str));
int length = sizeof(arr)/sizeof(int);
sort_func2(arr,length);
for(int i = 0; i<length; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}