选择排序

  • 原理
    现有 3,7,4,2,6,1 六个数字,从小到大排序时,先假设第一个数 3 为数组的最大值,最大值下标为 0,然后和剩余的数比较大小,若比当前的最大值大,则更新最大值的位置。如:3,7 比较,7 比较大最大值的下标为1。4,7 比较,7比较大则最大值的下标还是为1。2,7 比较,7比较大则最大值的下标还是为1…然后将 7 与数组最后一位互换位置,这样就确定了当前数组的最后一位,之后**不断减少数组长度,直到为 1,还不理解的看 视频讲解原理🖱️
    在这里插入图片描述

  • 代码
/* 找最大值位置的函数 */
int findMax(int arr[],int n){
	int max=arr[0];             //假设第一个值为最大值
	int pos=0;                  //用 pos 记录最大值的下标
	for(int i=0;i<n;i++){
		if(arr[i]>max){         //若arr[i]大于当前的最大值
				max=arr[i];     //更新最大值
				pos=i;          //更新最大值的下标
		}		
	}
	return pos;
}

void selectionSort(int arr[],int n){

	/* 主体部分:将当前最大值与当前数组的最后位互换 */
	for(n;n>=1;n--){            //不断减小数组长度,直到为 1
		int pos=findMax(arr,n);      
		int temp=arr[pos];
		arr[pos]=arr[n-1];
		arr[n-1]=temp;
	}
	
}

// 关键点:找最大值的位置,放于数组最后一位

  • 复杂度
    时间复杂度:O(n2)
    空间复杂度:O(1)

  • 实践
#include<stdio.h>
void selectionSort(int arr[], int n);

int main() {
	int arr[7] = { 1,6,4,7,2,0,7 };
	selectionSort(arr, 7);
	for (int i = 0; i < 7; i++) {
		printf("%d,", arr[i]);
	}
}

int findMax(int arr[], int n) {
	int max = arr[0];            
	int pos = 0;                  
	for (int i = 0; i < n; i++) {
		if (arr[i] > max) {        
			max = arr[i];    
			pos = i;       
		}
	}
	return pos;
}

void selectionSort(int arr[], int n) {
	for (n; n >= 1; n--) {          
		int pos = findMax(arr, n);
		int temp = arr[pos];
		arr[pos] = arr[n - 1];
		arr[n - 1] = temp;
	}
}

运行结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

头疼小宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值