选择排序思想:
在一组数据中,每一次遍历找到最大值(或者最小值),将它与最后一个数据(或者第一个数据)交换位置,每一趟确定一个数据的最终位置。
一:代码如下:
#define _CRT_SECURE_NO_WARNINGS_ 1
#include<stdio.h>
void Swap(int *p1, int *p2)
{
int tmp = 0;
tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
void select_sort(int arr[],int sz)
{
int i = 0;
int j = 0;
int tmp = 0;
for(i=0; i<sz-1; i++)
{
int maxpos = 0;
for(j=1; j<=sz-i-1; j++)
{
if(arr[j]>arr[maxpos])
{
maxpos = j;
}
}
if(maxpos!=sz-1-i)
{
Swap(arr+maxpos,arr+(sz-1-i));
}
}
}
void print_arr(int arr[],int sz)
{
int i=0;
for(i=0; i<sz; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
int main()
{
int arr[9]={9,2,7,5,3,4,1,6,8};
int sz = sizeof(arr)/sizeof(arr[0]);
select_sort_op(arr,sz);
print_arr(arr,sz);
return 0;
}
选择排序的优化:每一趟同时选出最大值和最小值,把最小值和第一个数据交换,最大值和最后一个数据交换。
二:代码如下:
#define _CRT_SECURE_NO_WARNINGS_ 1
#include<stdio.h>
void Swap(int *p1, int *p2)
{
int tmp = 0;
tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
void select_sort_op(int arr[],int sz)
{
int left = 0;
int right = sz-1;
while(left<=right)
{
int i = 0;
int maxpos = left;
int minpos = left;
for(i=left+1; i<=right; i++)
{
if(arr[i] > arr[maxpos])
{
maxpos = i;
}
if(arr[i] < arr[minpos])
{
minpos = i;
}
}
if(minpos != left)
{
Swap(arr+minpos,arr+left);
}
if(maxpos == left)
{
maxpos = minpos;
}
if(maxpos != right)
{
Swap(arr+maxpos,arr+right);
}
left++;
right--;
}
}
void print_arr(int arr[],int sz)
{
int i=0;
for(i=0; i<sz; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
int main()
{
int arr[9]={9,2,7,5,3,4,1,6,8};
int sz = sizeof(arr)/sizeof(arr[0]);
select_sort_op(arr,sz);
print_arr(arr,sz);
return 0;
}