选择排序
选择排序:
每一趟循环都从待排序序列中找到最小值,和待排序序列的第一个值进行交换,从而让待排序序列的长度-1,
直到待排序序列中只剩下一个值,则全部有序。
原始数据均认为是待排序的值。
n个值需要n-1趟排序
时间复杂度:O(n^2)
空间复杂度:O(1)
稳定性:有跳跃式的交换数据,不稳定
实现思路
具体实现
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#define DATANUM 15
void Show(int* arr, int length)
{
for (int i = 0; i < length; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int IsOrder(int* arr, int length)
{
for (int i = 0; i < length - 1; i++)
{
if (arr[i] > arr[i + 1])
{
return 0;
}
}
return 1;
}
void Swap(int* pa, int* pb)
{
int tmp = *pa;
*pa = *pb;
*pb = tmp;
}
void Select_Sort(int* arr, int length)
{
assert(arr != NULL || length > 1);
if (arr == NULL || length < 2)
{
printf("Select_Sort:Invalid Array\n");
return;
}
for (int i = 0; i < length - 1; i++)
{
int min = i;
for (int j = i + 1; j < length; j++)
{
if (arr[min] > arr[j])
{
min = j;
}
}
if (min != i)
{
Swap(&arr[i], &arr[min]);
}
}
}
int main()
{
int arr[DATANUM];
for (int i = 0; i < DATANUM; i++)
{
arr[i] = rand() % 100;
}
printf("Before Select_Sort:");
Show(arr, DATANUM);
Select_Sort(arr, DATANUM);
if (IsOrder(arr, DATANUM))
{
printf("After Select_Sort:");
Show(arr, DATANUM);
}
else
{
printf("Select Sort Failed\n");
}
return 0;
}