排序算法——选择法排序

选择法排序

选择排序(Selection Sort)是一种简单直观的排序算法。它的基本思想是每次从待排序的数据中选择最小(或最大)的元素,放到已排序序列的末尾,直到全部元素排序完成。

选择排序的步骤(以用指针的选择法排序为例):

1、遍历待排序序列,设立一个指针,初始指向序列的第一个元素。

2、从当前指针位置开始,依次与后面的元素比较,找到最小的元素,并记录其位置。
3、将最小的元素与当前指针位置的元素进行交换。

4、将指针向后移动一位,重复步骤2和步骤3,直到指针移动到序列的倒数第二个元素。

5、完成上述步骤后,最后一个元素已经是序列中的最大元素,排序完成。

选择排序的时间复杂度为O(n^2),其中n为待排序序列的长度。尽管选择排序的时间复杂度较高,但它的实现简单,适用于小规模的数据排序。

方法一:普通的选择法排序

#include<stdio.h>
int main()
{
	int a[10] = { 7,4,1,8,5,2,9,6,3,0 };
	int i, j, t;
	for (i = 0; i < 10; i++)//依次选择元素
	{
		for (j = i + 1; j < 10; j++)//与每一个元素进行比较
		{
			if (a[i] >a[j])
			{
				t = a[i];
				a[i] = a[j];
				a[j] = t;
			}
		}
	}
	for (i = 0; i < 10; i++)
	{
		printf("%3d", a[i]);
	}
	return 0;
}

总结
普通的选择法排序非常直观的展现出选择法排序的算法思路,先选择要进行排序的元素,再依次与其余元素进行比较、交换位置,最终完成排序。

方法二:利用指针的选择法排序

#include<stdio.h>
int main()
{
	void chioce(int* x, int y);//定义选择法排序的函数
	int n, i;
	int arr[100];
	scanf("%d", &n);//确定排序元素个数
	for (i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}
	chioce(arr, n);
	for (i = 0; i < n; i++)
	{
		printf("%d", arr[i]);
	}
	return 0;
}
void chioce(int* x, int y)//用指针传参
{
	int i, j, tmp;
	for (i = 0; i < y ; i++)//与末尾x++配合使用,确保指针能依次后移
	{
		for (j = 1; j < y - i; j++)//第二层循环依次比较
		{
			if (*x > *(x + j))
			{
				tmp = *x;
				*x = *(x + j);
				*(x + j) = tmp;
			}
		}
		x++;//指针后移,指向下一个元素
	}

总结
利用指针的选择法排序,分为两个模块(主函数和选择排序函数)使得结构更加规整。使用指针传参,让该程序更加简洁、高效。与普通的选择法排序不同之处在于,普通选择法排序的第一层循环是用于确定需要排序的元素,而利用指针技术的第一层循环是用于确定比较的次数与指针后移(x++)配合使用。

两种方法的区别

两种方法在思想上是相同的,只是在实现过程中有所不同。方法一是直接在数组中进行比较虽然看起来比较直观,但是如果元素过多要通过函数传参实现就会使程序运行效率减低。方法二,利用指针的不断后移去访问相应的元素,只需要控制好指针的移动就可以实现排序,可以使程序的效率大大提高。

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值