算法思想
遍历整个数组,在未排序的序列中找到最小(大)元素,存放到未排序序列的起始位置,然后再从剩下未排序中继续寻找最小(大)元素,放在未排序序列的起始位置,直到所有元素排序完成。
动画图解选择排序法
代码
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
void show(int arr[],int len) //打印数组元素
{
for (int i = 0; i < len; i++)
printf("%d\t", arr[i]);
printf("\n");
}
void selectsSort(int arr[],int len)//选择排序算法
{
int tmp;
for ( int i = 0;i < len - 1; i++)
{
for (int j = i + 1; j < len; j++)
if (arr[i] > arr[j])
{
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
void selectsSortOptimeze(int arr[], int len)//选择排序优化
{
for (int i = 0; i < len - 1; i++)
{
int idx = i;
for (int j = i + 1; j < len; j++)
{
if (arr[idx] > arr[j])
idx = j;
}
if(idx != i)
{
arr[idx] ^= arr[i];
arr[i] ^= arr[idx];
arr[idx] ^= arr[i];
}
}
}
//递归实现
//void Swap(int & min,int & arrData)//交换数据
//{
// int tmp = min;
// min = arrData;
// arrData = tmp;
//}
//
//
//int FindMin(int arr[], int Start, int End) //找对最小数据的下标
//{
//
// int min = Start;
// for (int i = Start + 1; i < End; i++)
// {
// if (arr[min] > arr[i])
// min = i;
// }
// return min;
//}
//
//void selectSortRecursion(int arr[], int Start, int End)//选择排序
//{
// int i = 0;
// if (Start<End)
// int min = FindMin(arr,Start,End);
// selectSortRecursion(arr, Start, End);
//}
int main()
{
srand(time(NULL));
int arr[10] = { 0 };
int arrLen = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < arrLen; i++)
arr[i] = rand() % 100;
show(arr,arrLen);
/*selectSortRecursion(arr, 1, arrLen);*/
//selectsSort(arr,arrLen);
selectsSortOptimeze(arr, arrLen);
show(arr, arrLen);
}
运行测试
说明
第一种给出的选择排序算法,当前元素和后面每一个元素进行比较,并且只要比当前元素小都进行交换,最终使得当前元素是最小值。
第二种优化之后,我们只是标记出后面元素中最小的元素和当前元素进行交换,所以比较的过程次数是没有改变的,但是我们可以优化交换的次数。上面的动态图解也是我们优化之后的算法过程。
第三种我们给出的是递归实现,但是我的电脑不能运行,问题出现会出现栈溢出,所以只是作为了解。
最好情况时间:O(n ^ 2)
最坏情况时间:O(n ^ 2)