选择排序基本思路
基本思路就是遍历两次,外层循环从0到n-1,内层循环选出最小的值与当前值进行交换,保证最小的值在前面。
void selectionSort(vector<int> &arr)
{
int n=arr.size();
int minIndex=0;
for(int i=0;i<n-1;i++)
{
for(int j=i+1;j<n;j++)
{
if(arr[minIndex]>arr[j])
{
minIndex=j;
}
}
swap(arr[i],arr[minIndex]);
}
}
二元选择排序算法
使用二元选择排序,每轮选择记录最小值和最大值,可以把数组需要遍历的最大值最小值缩小一倍。将最小值交换到首位,最大值交换到末尾
void selectionSort2(vector<int> &arr)
{
int minIndex,maxIndex;
int n=arr.size();
for(int i=0;i<n/2;i++)
{
minIndex=i;
maxIndex=i;
for(int j=i+1;j<n-i;j++)
{
if(arr[j]>arr[maxIndex])
{
maxIndex=j;
}
if(arr[j]<arr[minIndex])
{
minIndex=j;
}
}
//最大值和最小值相等且等于i,则排序完成
if(minIndex==maxIndex)break;
swap(arr[i],arr[minIndex]);
//如果最大值刚好是i,则需要更新maxIndex的值,因为i和minIndex交换了
if(maxIndex==i)maxIndex=minIndex;
swap(arr[maxIndex],arr[n-i-1]);
}
}