(C语言浙大版)实现选择排序并分析复杂度(附测试用例)


本博文源于浙江大学《数据结构》,今天老师讲了堆排序,在堆排序之前老师先提了一个老朋友选择排序,选择排序在课程前沿已经给出,实现起来不是很难,但是有以下的结论还是要提一下:

选择排序复杂度:
	时间复杂度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;
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值