选择排序原理与实现:
从一组数中挑选最大一个放到尾部,除去最后一个以外的数据再次选择最大的放到尾部,以此类推。
例:
有以下几个数:3 7 4 2 6 1,请使用选择排序将他们从小到大排列
解:
第一趟:
3 7 4 2 6 1
在其中找到最大的元素7,然后将其和最后一个元素交换位置:
3 1 4 2 6 7
第二趟:
3 1 4 2 6 7
除了已经排好的7,在其中找到最大的元素6,然后将其和最后一个元素交换位置:
3 1 4 2 6 7
第三趟:
3 1 4 2 6 7
除了已经排好的6和7,在其中找到最大的元素4,然后将其和最后一个元素交换位置:
3 1 2 4 6 7
第四趟:
3 1 2 4 6 7
除了已经排好的4,6和7,在其中找到最大的元素3,然后将其和最后一个元素交换位置:
2 1 3 4 6 7
第五趟:
2 1 3 4 6 7
除了已经排好的3,4,6和7,在其中找到最大的元素2,然后将其和最后一个元素交换位置:
1 2 3 4 6 7
此时已经排序完毕
最终结果为:1 2 3 4 6 7
代码实现:
#include <stdio.h>
int FindMaxPos(int arr[], int m)
{
int max = arr[0];
int pos = 0;
for (int i = 0;i < m;i++)
{
if (arr[i] > max)
{
max = arr[i];
pos = i;
}
}
return pos;
}
void SelectionSort(int arr[], int m)
{
while (m > 1)
{
int pos = FindMaxPos(arr, m);
int temp = 0;
temp = arr[m - 1];
arr[m - 1] = arr[pos];
arr[pos] = temp;
m--;
}
}
int main( )
{
int arr[6] = { 36,55,14,63,82,81 };
SelectionSort(arr,6);
for (int i = 0;i < 6;i++)
{
printf_s("%d", arr[i]);
}
}
时间复杂度:
m + (m-1) + (m-2) +…+2=(m+2)*(m-1)/2
时间复杂度即为O(n2)