基本思想:在数据中,每一趟(第i趟,i = 0,1,2,3…,n-2)在后面n-i个待排序的数据元素集合中选出关键码最小的数据元素,作为有序元素序列的第i个元素,待到第n-2趟做完,待排序元素集合只剩下1个元素,排序结束。
直接选择排序:得到一个待排序的元素集合,我们先默认第一个元素为最小元素,用min标记起来。在待排序元素集合中,依次比较大小,如果比min标记的元素小,就把min标记到小的哪一个元素。直到元素比完,找到最小的元素,然后与第一个元素交换位置。
void SelectSort(int *array,int size)
{
int min = 0;
for (int i = 0; i < size; i++)
{
min = i;
for (int j = i; j < size; j++)
{
if (array[min] > array[j])
{
min = j; //标记最小的元素
}
}
std:swap(array[min], array[i]);
}
}
void myprint(int *array,int size)
{
for (int i = 0; i < size; i++)
{
cout << array[i]<<" ";
}
cout << endl;
}
int main()
{
int array[] = { 5,6,8,2,3,1,9,7,0 ,4};
int size = sizeof(array) / 4;
SelectSort(array, size);
myprint(array, size);
return 0;
}
空间复杂度O(1) ;
时间复杂度O(n*n) ; 要排n个元素,每次比较n-1次,找到min,要n*(n-1)次才能排位
适用场景:数据规模小(n比较小)
稳定性:不稳定
直接排序优化:
一次找出min,max,把min,max分别与第left个元素,第right个元素交换,left >= right 时,排序结束。
void SelectSort_OP(int *array, int size)
{
int left = 0;
int right = size - 1;
while (left<right)
{
int min = left;
int max = right;
for (int i = left; i <= right; i++)
{
if (array[i] > array[max])
max = i;
if (array[i] < array[min])
min = i;
}
std:swap(array[max], array[right]);
if (min == right) //考虑最小值在right的情况
min = max;
swap(array[min], array[left]);
left++;
right--;
}
}
要排n个元素,排完需要经常 n(n-1)/2 次
时间复杂度:O(n*n)