简单选择排序是选择排序的一种,下面是选择排序的一些特征:
- 时间复杂度,最好最坏平均都为:O(n^2)
- 空间复杂度,最好最坏平均都为:O(1)
- 是否稳定:不稳定
每次排序都将一个元素放到最总位置上,第k次排序,放第k大的元素到最终位置上
简单选择排序的基本思想:每次选择剩余元素中最小(大)的元素放到排好的序列最后(前),知道剩余元素为0。
下面是简单选择排序的代码:
/**
* arr 数组首地址
* len 数组长度
*/
void select_sort(int *arr, int len)
{
int i, j;
for (i=0; i<len-1; i++) { // 把len个元素中较小的len-1个元素排好序后,那len个元素就排好序了
int min = i;
for (j=i+1; j<len; j++)
if (arr[j]<arr[min])
min = j;
if (min!=i)
swap(arr+i, arr+min); // 交换两个元素的位置
}
}
测试代码,可直接复制后编译执行:
#include <stdio.h>
void show(int *arr, int len);
void select_sort(int *arr, int len);
void swap(int *px, int *py);
int main()
{
int len = 7;
int arr[] = {7, 10, 11, 9, -8, 2, 27};
select_sort(arr, len);
show(arr, len);
return 0;
}
/**
* 交换两个元素的值
*/
void swap(int *px, int *py)
{
int temp = *px;
*px = *py;
*py = temp;
}
/**
* arr 数组首地址
* len 数组长度
*/
void show(int *arr, int len)
{
int i;
for (i=0; i<len; i++) {
printf("%4d", arr[i]);
}
printf("
");
}
/**
* arr 数组首地址
* len 数组长度
*/
void select_sort(int *arr, int len)
{
int i, j;
for (i=0; i<len-1; i++) { // 把len个元素中较小的len-1个元素排好序后,那len个元素就排好序了
int min = i;
for (j=i+1; j<len; j++)
if (arr[j]<arr[min])
min = j;
if (min!=i)
swap(arr+i, arr+min); // 交换两个元素的位置
}
}