选择排序
选择排序法 是对 定位比较交换法(也就是冒泡排序法) 的一种改进。选择排序的基本思想是:每一趟在n-i+1(i=1,2,…n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。
选择排序流程
第一趟:
先在未排序的数字中随便找到一个数字,将其定为最小的值,并让当前最小的值与其他数字依次比较,如果其他数字大于当前最小值则当前最小值继续与下一个数字进行比较,如果当前最小值大于比较的数字则,将最小值换为当前比较的数字,并继续进行比较,直到比较完所有的数字,并将当前最小值和排序的数字中第一个数字相交换(从小到大排序)
第二趟:
在第一趟的基础上,排序的数字除去第一个数字,在其他数字中随便找到一个数字充当最小值,继续重复第一趟操作(不与第一个数字比较)
第三趟:
在第二趟的基础上,排序的数字除去前两个个数字,在其他数字中随便找到一个数字充当最小值,继续重复第一趟操作(不与前两个数字比较)
第四趟:
同理
如下图
总代码:
其时间复杂度:O(n*n)
空间复杂度:O(1)
稳定性:不稳定
#include <stdio.h>
#include <stdlib.h>
#define MAX 10
void Swap(int *a,int *b) //交换
{
int tmp = *a;
*a = *b;
*b = tmp;
}
void Selectionsort(int arr[],int size) //选择排序
{
int i,j;
int min;
for(i=0;i<size-1;i++)
{
min = i;
for(j=i+1;j<size;j++)
{
if(arr[j]<arr[min])
{
min = j;
}
}
Swap(&arr[i],&arr[min]);
}
}
void ShowSort(int *arr,int size) //打印数组
{
int i;
for(i=0;i<size;i++)
{
printf("%2d ",arr[i]);
}
printf("\n");
}
int main()
{
int arr[MAX];
int i;
for(i=0;i<10;i++)
{
arr[i] = rand()%100; //获得随机数
printf("%2d ",arr[i]);
}
printf("\n");
Selectionsort(arr,MAX);
ShowSort(arr,MAX);
return 0;
}