简单选择排序

  在上一个文章当中,我讲解了冒泡排序,冒泡排序的时间复杂度是O(N^2),今天,我又给大家介绍一个排序算法“简单选择排序”,顾名思义,我们就是要在数组里面来选择,选择什么呢?如果是想要从小到大排序,就每一次选择最小的数字,反之,就选择最大的数字。

  简单选择排序,每一次找一个最小(大)的数,需要O(N)的时间,再加上我们要进行N次找最小(大)的数,所以,我们的时间复杂度为O(N^2)。

  我们可以举个例子来讲:

 

  上图是我们的原始序列,我们先从j=0开始,到 j=5停止,在这6个数字之中来寻找最少的,经过N次比较,我们知道了,2是第一次求出最小的数字,所以2我们将其排在第一位,为了不多建立一个空间,我们可以在原始数组里面操作,怎么操作呢?

  在原始数组里面,2是在地址为5是空间里面,但是它是最小的数字,必须要排到第一位,但是第一位是19,替换过后19不就没了吗?所以,我们可以进行一次互换位置,将2和9进行位置转换。

   在将2和19换了之后,我们从j=1开始,到j=5停止之间来寻找最小的数(不用找地址区间为1的了,因为它已经正确排序),我们找到了4这个数,可以将4和54来进行位置互换。

  2和4是正确的位置,然后继续找最小的数,19,将19和54交换。

 

30是最小的数字,并且刚好在正确位置上,所以不用多此一举,在程序里面需要一个特例。

 

54是最小的,将54和70换位置。

最后,只有70一个数字了,我们就可以直接默认它是最大的那个数。

  这就是我们整个简单选择排序算法的大概意思,给大家看一看代码:

简单选择排序C语言代码:

#include<stdio.h>
#include<stdlib.h>
using namespace std;
void printArray(const int *a,int n)
{
	for(int i=0;i<n;i++)
	  printf("%d ",a[i]);
	printf("\n");
}
void swap(int *p1,int *p2){
	int t;
	t=*p1;
	*p1=*p2;
	*p2=t;
}
void selectionSort(int *array,int size){
	int min,minv;
	for(int i=0;i<size-1;i++){
		minv=array[i];
		min=i;
		for(int j=i+1;j<size;j++){
			if(array[j]<minv){
				minv=array[j];
				min=j;
			}
		}
		if(min-i!=0) swap(&array[i],&array[min]);
		printf("%d: ",i);
		printArray(array,size);
	}
}
int main(){
	int n;
	scanf("%d",&n);
	int array[n];
	for(int i=0;i<n;i++)  scanf("%d",&array[i]);
	printArray(array,n);
	selectionSort(array,n);
	printArray(array,n);
}

 简单选择排序C++代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	cin>>n;
	int a[n],x,min;
	for(int i=0;i<n;i++)  
	  cin>>a[i];
	for(int i=0;i<n;i++){
		min=0x99999999,x=0;
		for(int j=i;j<n;j++){
			if(a[j]<min){
				min=a[j],x=j;
			}
		}
		swap(a[i],a[x]);
	}
	for(int i=0;i<n;i++)
	  cout<<a[i]<<",";
	return 0;
}

   大家看,C语言与C++的代码长度相差了那么多,是为什么呢?是因为C++里面拥有STL库,里面有已经提前编好的函数,直接拿来用就可以,而C语言就只能自己编了!

  今天就到这里了,下次给大家带来简单插入排序!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

龙星尘

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

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

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

打赏作者

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

抵扣说明:

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

余额充值