本博文源于浙江大学《数据结构》,今天老师讲了堆排序,在堆排序之前老师先提了一个老朋友选择排序,选择排序在课程前沿已经给出,实现起来不是很难,但是有以下的结论还是要提一下:
选择排序复杂度:
时间复杂度O(N^2/2)
空间复杂度:O(1)
KCN = n^2/2
算法特点
算法稳定
可用于链式结构
移动记录次数较少,当每一记录占用空间教多时,此方式比直接插入排序快
选择排序内部分析
选择排序无论在什么情况下,都需要比较N*(N-1)/2次,故其时间复杂度为O(N^2).事实上,将第i个元素与最小元素交换之前的判断,如果最好的情况下,是不用交换的,如果最坏的情况下为3(N-1)次(除最后一个元素外,每个元素都要经过3步交换位置),因此选择排序的O(N*N)让其为后序更优秀的排序实现提供了一种遐想!
测试用例
int arr[5] = {5,3,1,6,2};
用一个整型数组作为容器,5只是大小可以由各位进行扩充,数据可以进行删减。
严蔚敏版本源码
void SelectSort(int r[]){
for(int i=0;i<5;++i){
int k = i;
for(int j = i+1;j<=5-1;++j){
if(r[j]<r[k]) k = j;
}
if(k != i){
int t=r[i];
r[i] = r[k];
r[k] = t;
}
}
}
源码附上(浙大版本)
//选择排序
#include<stdio.h>
typedef int ElementType;
void Print_Array(ElementType A[],int N)
{
printf("\n");
for(int i=0;i<N;i++)
printf("%d ",A[i]);
}
void Swap(int *X,int *Y)
{
int tmp = *X;
*X = *Y;
*Y = tmp;
}
int ScanfForMin(int A[],int i,int N)
{
int min = i;
for(int j=i+1;j<=N;j++)
if(A[j]<A[min]) min = j;
return min;
}
void Selection_Sort(ElementType A[],int N)
{
for(int i = 0;i<N;i++){
int MinPosition = ScanfForMin(A,i,N-1);
Swap(&A[i],&A[MinPosition]);
}
}
int main()
{
int arr[5] = {5,3,1,6,2};
Print_Array(arr,5);
Selection_Sort(arr,5);
Print_Array(arr,5);
return 0;
}