选择(select)排序算法

直接排序是不稳定的排序。

1、直接排序算法的基本思想

n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。

(1) 初始状态:无序区为A[1...n],有序区为空。

(2) 第一趟排序:在无序区A[1...n]中选出最小的记录A[k],将他与无序区的第一个记录A[1]交换,使A[1...1]和A[2...n]分别变为记录个数增加1的新有序区和记录个数减少1的新无序区。

(3)第i趟排序:第i趟排序开始时,当前有序区和无序区分别为A[1.,.i-1]和A[i...n](1<=i<=n-1)。该趟排序从当前无序区中选出关键字最小的记录A[K],将它与无序区的第一个记录A[I]交换,使A[1...n]和A[I+1...n]分别变为记录个数增加1的新有序区和记录个数减少1的新无序区。这样,n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。直接选择排序是不稳定的排序算法。

2、思想

首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素均排序完毕。具体做法是:选择最小的元素与未排序部分的首部交换,使得序列的前面为有序。

3、算法复杂度

最好情况下:交换0次,但是每次都要找到最小的元素,因此大约必须遍历N*N次,因此为O(N*N)。减少了交换次数

最坏情况下,平均情况下:O(N*N)

4、稳定性

 由于每次都是选取未排序序列A中的最小元素x与A中的第一个元素交换,因此跨距离了,很可能破坏了元素间的相对位置,因此选择排序是不稳定的!

5、代码实现

//编程实现选择排序
//顾名思义,选择排序是无序区中选择最小的一个元素放在第一位置,次小的元素放到第二个位置。
//1.选择第一个元素即a[0]为临时元素为最小,遍历后面的元素与之比较,只要出现比tempMin小的数a[j],将a[j]赋值给tempMin。
//2.将第一个元素与后面最小元素的位置进行交换(a[l]=a[i]),最小元素放到第一个元素位置上。
//3.重复上述操作,直至将整个数组遍历一遍,i=0;i<len-1,i++;内层循环为j=i+1;j<len;j++.
#include<iostream>
using namespace std;

void select_sort(int a[], int len)
{
	int i,j,l, tempMin;							
	for (i = 0; i < len-1; i++)				<span style="white-space:pre">	</span>//对0~len-2进行循环,进行len-1次
	{
		tempMin = a[i];						//每次都取无序区的第一个数为临时最小数
		l = i;							//记录临时最小数的下标(无序区第一个元素下标)
		for (j = i+1; j < len; j++)			<span style="white-space:pre">	</span>//从i+1的位置(临时最小数的后一位)向数组尾部进行遍历
		{
			if (a[j] < tempMin)				//无序区+1到数组尾部有小于临时最小数
			{
				tempMin = a[j];				//tempMin保存每次遍历搜索到的最小数
				l = j;					//l记录最小数的位置
			}
		}
		a[l] = a[i];						//把最小元素与a[i](无序区第一个元素)进行交换
		a[i] = tempMin;
	}
}

static void print_array(int a[], int len)
{
	for (int i = 0; i < len; i++)			<span style="white-space:pre">		</span>//打印数组
	{
		cout << a[i] << " ";
	}
}

void main9mianshiti5()
{
	int a[] = { 54, 38, 96, 23, 15, 72, 60, 45, 83 };
	cout << "before select sort:";
	print_array(a, 9);
	select_sort(a, 9);						//选择排序
	cout << "\nafter select sort:";
	print_array(a, 9);
	system("pause");
}

6、测试结果

before select sort:54 38 96 23 15 72 60 45 83

after select sort:15 23 38 45 54 60 72 83 96

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值