排序算法之(简单)选择排序

本文详细介绍了选择排序算法的工作原理、步骤,以及如何用C语言实现选择排序过程。通过举例和代码展示,解释了如何通过不断寻找并交换最小元素来对数组进行排序。
摘要由CSDN通过智能技术生成

1.定义

        选择排序是一种简单直观的排序算法,它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始(或末尾)位置,直到全部待排序的数据元素排完。

2.原理

        选择排序的主要原理是通过不断的选择剩余元素中的最小者

        首先,找到数组中最小的元素并将其和数组第一个元素交换位置,然后找到数组剩下元素中最小的元素并将其与数组的第二个元素交换,依此类推。

3.举例

假设我们有一组待排序的数字: [29, 10, 14, 37, 13]

  • 第一步: 在未排序的数组中找到最小元素(10),将其与第一个元素交换位置,得到 [10, 29, 14, 37, 13]
  • 第二步: 在剩下的未排序数组中找到最小元素(13),与第二个元素交换位置,得到 [10, 13, 14, 37, 29]
  • 第三步: 在剩下的未排序数组中找到最小元素(14),已经在正确的位置,不需要交换
  • 第四步: 在剩下的未排序数组中找到最小元素(29),与第四个元素交换位置,得到 [10, 13, 14, 29, 37]
  • 最后一步: 剩下的一个元素(37)已经在正确的位置,排序完成。

4.思路

下面的这个思路是基于由小到大排序的,由大到小是一样的思路

1.定义一个变量k,首先保存第一个元素的下标,k=0,从第二个元素开始,依次和arr[k]进行比较,若有数据比arr[k]小,k就记录较小值的下标,一轮比较完毕之后,k就记录着最小值的下标

2.判断下标k的值和初始值,是否相同,若是相同(即k没动),说明当前位置是最小的,不做任何操作,若是不同,说明最小的值在后面,则交换arr[k]和arr[初始下标]的值

3.第二轮,k=1开始,后面的步骤以此类推

5.代码

#include<stdio.h>

//输出函数
void output_array(int *p,int len){
	int i = 0;
	for(i = 0;i < len;i++){
		printf("%d   ",p[i]);
	}
	printf("\n");
	return;
}

//交换函数
void swap(int *a,int *b){
	int temp = *a;
	*a = *b;
	*b = temp;
	return ;
}

//排序函数
void select_sort(int *p,int len){
	int i = 0,j = 0,k = 0;
	//只需len-1次,遍历数组中除最后一个元素外所有的元素
	for(i = 0;i < len - 1;i++){
		//k记录起始值
		k = i;
		//从下一个元素开始比较
		for(j = k + 1;j < len;j++){
			if(p[j] < p[k]){
				k = j;
			}
		}
        //判断这个k是否为初始值	
		if(k != i){
			//如果不为初始值的话,则说明需要发生交换
			swap(&p[k],&p[i]);	
		}
	}
	return ;
}


int main(){
	//	        k
	int a[5] = {29,10,14,37,13};
	//             j

	int len = sizeof(a) / sizeof(a[0]);

	printf("原始数据为:\n");
	output_array(a,len);

	printf("经过简单选择排序之后的数据为:\n");
	select_sort(a,len);
	output_array(a,len);

	return 0;
}

6.运行

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值