排序-选择排序

原创 2018年04月17日 21:45:53

    选择排序是一种基于比较的简单排序(不稳定)。 它的基本原理是:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

算法描述:

  • 初始状态:无序区为R[1..n],有序区为空;
  • 第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中-选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R[i+1..n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;
  • n-1趟结束,数组有序化了。

算法的时间复杂度:

    选择排序的时间复杂度取决于趟数和寻找最小(最大)元素时间的累积,与原始数据的有序性无关。该算法的平均时间复杂度为O(n^2), 最好时间复杂度O(n^2),最坏时间复杂度O(n^2)。

代码实现:

#include <iostream>
using namespace std;

void swap(int *a, int *b)
{
	int temp = *a; *a = *b; *b = temp;
}

void select(int arr[], int len)
{
	int min = 0;

	for(int i = 0; i != len; i++){
	
		if(arr[i] < arr[min]){		
			min = i;
		}	
	}

	swap(arr[min], arr[0]);
}

void selectionSort1(int arr[], int len)
{
	for(int i = 0; i != len; i++)
		select(arr + i, len - i); 	

}

void selectionSort2(int arr[], int len)
{
	if(len == 1 )
		return ;

	int min = 0;
	for(int i = 1; i != len; i++)
	{
		if(arr[i] < arr[min])
		{
			min = i;
		}
	
	}
	swap(arr[min], arr[0]);
	selectionSort2(arr+1, len-1);


}

void selectionSort3(int arr[], int len)
{

	for(int i = 0; i != len - 1; i++)		// 排序趟数
	{

		int min = i;
		for(int j = i + 1; j != len ; j++)
		{
			if(arr[j] < arr[min]){
			
				min = j;
			
			}
		
		}
		swap(arr[min], arr[i]);		
	
	}

}

int main()
{

	int arr[10] = {1,3,4,2,6,5,25,18,9,13};
	selectionSort3(arr, 10);

	for(int i = 0; i != 10; i++ )
		cout << arr[i] << " ";
	cout << endl;


}

运行结果:

1 2 3 4 5 6 9 13 18 25

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SnailCpp/article/details/79981115

数据结构 - 树形选择排序 (tree selection sort) 详解 及 代码(C++)

树形选择排序 (tree selection sort) 详解 及 代码本文地址: http://blog.csdn.net/caroline_wendy算法逻辑: 根据节点的大小, 建立树, 输出树...
  • u012515223
  • u012515223
  • 2014-06-11 11:18:04
  • 2453

排序算法之树形选择排序

树形选择排序又名锦标赛排序,算法思想与体育比赛类似, 首先将n个数据元素两两分组,分别按关键字进行比较,得到n/2个比较的优胜者(关键字小者),作为第一步比较的结果保留下来, 然后对这n/2个数据元素...
  • wf131410000
  • wf131410000
  • 2015-08-19 21:28:31
  • 2484

Java常见排序:(一)直接选择排序

常见的一些内部排序算法 排序:常见的也是基础的一些算法。 评价排序算法优劣的标准: 1.      时间复杂度:主要是分析关键字的比较次数和记录的移动次数。 2.      空间复杂度:分析排...
  • daguairen
  • daguairen
  • 2016-10-06 21:05:54
  • 643

《数据结构--排序》之选择排序

1.序 选择排序(selection sort)的基本思想是:每一趟在序列 sq[1],sq[2],...,sq[length]中选取关键字最大的记录作为序列最后一个记录,然后再从剩下的记录...
  • zhccl
  • zhccl
  • 2012-09-09 20:04:12
  • 3388

数据结构之排序:直接选择排序

选择排序的主要思想是每一趟从待排序序列中选取一个关键值最小的记录,即第1趟从n个记录中选取关键字值最小的记录,第2趟从剩下的n-1个记录中选取关键字值最小的记录,知道整个序列中的记录都选完为止。由选取...
  • u011080472
  • u011080472
  • 2016-05-02 17:42:14
  • 942

java实现直接选择排序

数据结构中,有很多排序算法,xue
  • u014039577
  • u014039577
  • 2014-10-06 10:46:25
  • 1363

“深入理解”—选择排序算法

选择排序算法有两种:直接选择排序和堆排序
  • qq_25827845
  • qq_25827845
  • 2016-07-10 11:37:25
  • 6879

选择排序之树形选择排序(TreeSelectionSort)

一、简单选择排序思想 很显然,每次我们比较后就把数据进行交换,取出了关键字最小的记录,但是对于与最小关键字记录交换的数据我们直接扔进了乱序中,没有利用这次比较。导致每次选择都要重新比较。 二、树形...
  • qq_16234613
  • qq_16234613
  • 2016-09-26 23:56:06
  • 1189

C++排序之直接选择排序法

直接选择排序算法是一种简单直观的排序算法。它首先在未排序序列中找到最小(大)元素,存放到排序序列的其起始位置,然后再从剩余未排序的序列元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,...
  • lycx1234
  • lycx1234
  • 2017-02-06 14:54:38
  • 2139

选择排序、树形排序、堆排序的java代码实现

package com.sort; /** * 选择排序: * 简单选择排序,树形选择排序与堆排序 * */ public class SelecSortDemo { ...
  • a15994269853
  • a15994269853
  • 2014-03-12 20:46:20
  • 2800
收藏助手
不良信息举报
您举报文章:排序-选择排序
举报原因:
原因补充:

(最多只允许输入30个字)