思想:遍历数组中未排序的部分,取出最小值最大值,分别和未排序的第一个最后一个交换位置,然后重复此操作
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void swap(int *x,int *y){
int tmp = *x;
*x= *y;
*y = tmp;
}
//函数参数:待排序数组_arr,控制排序元素个数_n
void selectsort(int *arr,unsigned int n){
if(n < 2) return;
int left,right;
int i;
int minpos; //保存最小值下标
int maxpos; //保存最大值下标
left = 0; right = n-1;
while(left < right){
minpos = maxpos = left;
for(i = left;i <= right;i++){
if(arr[i] < arr[minpos])
minpos = i;
if(arr[i] > arr[maxpos])
maxpos = i;
}
if(minpos != left) swap(&arr[left],&arr[minpos]);
//当最大值下标在最左边时,因最小值已与最左边值交换,此时最小值下标存放着最大值
if(maxpos == left) maxpos = minpos;
if(maxpos != right) swap(&arr[right],&arr[maxpos]);
}
left++;
right--;
}
//通过递归函数
void select2(int *arr,unsigned int n){
if(n<2) return;
int i;
int minpos = 0;
int maxpos = 0;
int left = 0;
int right = n-1;
for(i = left;i<=right;i++){
if(arr[i] < arr[minpos]){
minpos = i;
}
if(arr[i] > arr[maxpos]){
maxpos = i;
}
}
if(minpos != left) swap(&arr[left],&arr[minpos]);
if(maxpos == left) maxpos = minpos;
if(maxpos != right) swap(&arr[right],&arr[maxpos]);
n = n-2;
select2(++arr,n);
}
int main(int argc, char *argv[]) {
int arr[] = {2,1,56,2,45,23,56,45,65,9};
// selectsort(arr,10);
int j;
for(j = 0;j<10;j++)
printf("%d ",arr[j]);
printf("\n");
select2(arr,10);
for(j = 0;j<10;j++)
printf("%d ",arr[j]);
return 0;
}