选择排序的思路:
- 1>首先在待排序序列中找到最小元素和最大元素,分别存放到排序序列的起始位置和末位置。
- 2>此时缩小区间范围,即 【begin,end】 变为 【begin+1,end-1】
- 3>再从剩余待排序元素中继续寻找最小元素和最大元素,然后分别放到该待排序序列的起始位置和末位置。
易错点:
swap(arr[begin], arr[min_pos]);
/*当最大值位于begin位置处时,
该交换操作过后可能将上面循环找到的max_pos位置对应的最大值被交换到最小值的位置上去*/
//此时俩个 swap代码行 的相对顺序就不可以改变
if (begin == max_pos)//重点注意:不能缺少这一步
//目的是防止防止最大值位于序列开头,被最小值交换。
{
max_pos = min_pos;//赋值操作过后,a[max_pos]才是该遍历过程中真正最大的数
}
swap(arr[end], arr[max_pos]);
实现代码:
//选择排序:
void SelectSort(int *arr, int length)
{
int begin = 0, end = length - 1;
while (begin < end)
{
int min_pos = begin, max_pos = end;//要随着每一次的区间长度减小而更新取值
for (int i = begin; i <= end; i++)
{
if (arr[i] < arr[min_pos])
{
min_pos = i;
}
if (arr[i] > arr[max_pos])
{
max_pos = i;
}
}
swap(arr[begin], arr[min_pos]);
/*当最大值位于begin位置处时,
该交换操作过后可能将上面循环找到的max_pos位置对应的最大值被交换到最小值的位置上去;
(即begin位置处即是max_pos,又是begin,而在找到最小值后因为必须要与begin位置上的的元素交换,
所以最大值就被交换到了min_pos的位置上)*/
//此时俩个 swap代码行 的相对顺序就不可以改变
if (begin == max_pos)//重点注意:不能缺少这一步
{
max_pos = min_pos;//赋值操作过后,a[maxi]才是该遍历过程中最大的数
}
swap(arr[end], arr[max_pos]);
begin++;
end--;
}
}
int main()
{
//int arr[] = { 1, 5, 6, 7, 4, 3, 2 };
int arr[] = { 9,1,2,5,7,4,8,6,3,5};
//int arr[] = { 5, 4, 3, 2, 1,0};
//InsertSort(arr, sizeof(arr) / sizeof(int));插入排序
//ShellSort(arr, sizeof(arr) / sizeof(int));希尔排序
SelectSort(arr, sizeof(arr) / sizeof(int));
for (auto e : arr)
{
cout << e << " ";
}
return 0;
}