选择排序:(时间复杂度O(N^2))
首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素均排序完毕。
选出数组中最小的数的下标
选出一个最小的和一个最大的(下标),依次放在左边和右边,为begin和end,然后begin++,end–之后,在begin和end区间再去选择两个数,依次放左边和右边….
缺点:就算数组的有序的但是时间复杂度仍然是O(n^2)
代码:
Sort.h
#pragma once
void SelectSort(int* a, size_t n)
{
assert(a);
int begin = 0;
int end = n - 1;
while (begin < end)
{
int min = begin, max = begin;
for (size_t i = begin; i <= end; ++i)
{
if (a[i] < a[min])
{
min = i;
}
if (a[i] > a[max])
{
max = i;
}
}
swap(a[max], a[end]);
//if语句修正交换,如果max占据了begin的位置,则更正max的位置
if (min == end)
{
min = max;
}
swap(a[min], a[begin]);
++begin;
--end;
}
}
void TestSelectSort()
{
int a[] = { 2, 5, 4, 9, 3, 6, 8, 7, 1, 0 };
SelectSort(a, sizeof(a) / sizeof(a[0]));
PrintArray(a, sizeof(a) / sizeof(a[0]));
}
Test.h
#include<iostream>
#include<assert.h>
using namespace std;
#include"Sort.h"
int main()
{
TestSelectSort();
system("pause");
return 0;
}