选择排序
// 交换2数
void xxx_swap(int& a, int& b)
{
int temp = a;
a = b;
b = temp;
}
// 选择排序1
// 1、将arr[j]依次与arr[i]比较,将较小者存放在arr[j]处
// 2、j控制外层循环,取值为0~N-1
// 3、i控制内层循环,取值从j+1~N-1
// 4、缺点:有些位置并非最小值,仍然被交换到j位置,然后又被交换到其他位置
void xxx_select_1(int arr[], int N)
{
if (arr == NULL || N < 2)
{
return;
}
for (int j = 0; j < N; ++j)
{
for (int i = j + 1; i < N; ++i)
{
if (arr[i] < arr[j]) // 交换2者
{
xxx_swap(arr[i], arr[j]);
}
}
}
}
// 选择排序2:从j~N-1区间内,找出最小值下标minIndex,将arr[j]与arr[minIndex]交换
// 1、用i遍历数组,i取值为j+1~N-1,minIndex记录在遍历过程中最小值的下标
// 2、将arr[minIndex]与arr[j]交换即可,j取值从0~N-1
void xxx_select_2(int arr[], int N)
{
if (arr == NULL || N < 2)
{
return;
}
for (int j = 0; j < N; ++j)
{
int minIndex = j; // 假定j位置为当前最小值位置
for (int i = j + 1; i < N; ++i)
{
minIndex = (arr[i] < arr[minIndex]) ? i : minIndex;
}
xxx_swap(arr[minIndex], arr[j]);
}
}
void test()
{
int arr[] = { 3,4,2,5,6,8,1,-5,10,50 };
int N = sizeof(arr) / sizeof(arr[0]);
xxx_select_2(arr, N);
for (int i = 0; i < N; ++i)
{
cout << arr[i] << ",";
}
cout << endl;
}