1,基本原理
从第一个数开始和后面的数比较,选择最小的数,将两数交换,接着从第二个数开始与后面的数比较,这样就得到了一个升序排列的数列
第一次:9,1,5,8,3 //交换 9 1
第二次:1,9,5,8,3 //交换 9 3
第三次:1,3,5,8,9 //不交换
第四次:1,3,5,8,9 //不交换
第五次:1,3,5,8,9 //不交换
2,实现方法
2.1双重循环
void xuanze(int *arr,int n)
{
if(n < 2)
{return ;}
int i,j,temp;
for(i = 0;i < n-1;i++)
{
for(j = i+1;j < n;j++)
{
if(arr[i] > arr[j])
{
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}
2.2递归法
void xuanze(int *arr,int n)
{
if(n < 2)
{return ;}
int i,j,temp;
for(i = 0;i < n-1;i++)
{
if(arr[i] > arr[i+1])
{
temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
xuanze(arr,--n);
}
3,优化方法
选择排序是每次选择最小的值,优化方法是每一次把最小的和最大的值选出来,最小的放左边,最大的放右边,这样循环趟数减半
void xuanze(int *arr,int n)
{
if(n < 2)
{return ;}
int ileft,iright;
int i;
int iminpos;
int imaxpos;
ileft=0; iright=n-1;
while (ileft<iright)
{
iminpos=imaxpos=ileft;
for (i=ileft;i<=iright;i++)
{
if (arr[i]<arr[iminpos]) iminpos=i;
if (arr[i]>arr[imaxpos]) imaxpos=i;
}
if (iminpos!=ileft)
{
temp = arr[ileft];
arr[ileft] = arr[iminpos];
arr[iminpos] = temp;
}
swap(&arr[ileft],&arr[iminpos]);
if (imaxpos==ileft) imaxpos=iminpos;
if (imaxpos!=iright) swap(&arr[iright],&arr[imaxpos]);
{
temp = arr[right];
arr[right] = arr[imaxpos];
arr[imaxpos] = temp;
}
ileft++;
iright--;
}
}
4,时间复杂度
O(n²)