1、选择排序思路
先遍历一遍待排序序列,从中标记最大的(最小的)数的下标,将标记的数和最后一个数(第一个数)进行交换。除去这次找的数,其余数再循环此过程,直至剩余一个数;
2、代码实现
#include <stdio.h>
#include <stdlib.h>
//输出
void ShowArr(int* arr, int len)
{
for (int i = 0; i < len; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
//判断是否有序
void IsSort(int* arr, int len)
{
for (int i = 0; i < len - 1; i++)
{
if (arr[i] > arr[i + 1])
{
printf("无序\n");
return;
}
}
printf("有序\n");
}
//交换两数
void Swap(int* p, int* q)
{
int tmp;
tmp = *p;
*p = *q;
*q = tmp;
}
//选择排序
void SelectSort(int *arr, int len)
{
for (int i = 0; i < len - 1; i++)
{
//最大的数下标
int max_index = 0;
for (int j = 0; j < len - i; j++)
{
if (arr[j] > arr[max_index]) max_index = j;
}
Swap(&arr[max_index], &arr[len - 1 - i]);
}
}
void Test()
{
int arr[10] = { 0 };
int len = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < len; i++)
{
arr[i] = rand() % 100;
}
SelectSort(arr, len);
ShowArr(arr, len);
IsSort(arr, len);
}
int main()
{
Test();
return 0;
}
3、测试结果
4、算法分析
时间复杂度:O(n^2)(等差数列求和)
空间复杂度:O(1)
稳定性:不稳定