排序--SelectSort优化

SelectSort:(以升序为例)

选择排序的基本思想:初始时,有序区为0,每一趟在无序区中选出一个关键字最小的元素,然后与无序区第一个元素交换,然后无序区减1,有序区加1,直到记录全部排完。

直接选择排序:第一趟排序在R[0..n]中选出一个关键字最小的与R[0]交换,第二趟在R[1..n]中选择一个最小的与R[1]进行交换,以此类推直到无序区的记录只剩一个时排序完成。

要知道"比较"与"移位"相比,移位更花费时间,所以直接选择排序相比于插入排序来说,能更好一点。

根据上面思想,我们可以写出直接选择排序的一般代码:

void SelectSort(int *arr , int len)
{
	int i = 0;
	int j = 0;
	int k = 0;
	int tmp = 0;
	for (i = 0; i < len-1; i++)
	{
		k = i;
		for (j = i + 1; j < len; j++)
		{
			if (arr[j] < arr[k])   //寻找无序区最小的元素的下标
			{
				k = j;
			}
		}
		if (k != i)              //如果寻找的元素下标不等于有序区最后一个元素下标则交换
		{
			tmp = arr[i];
			arr[i] = arr[k];
			arr[k] = tmp;
		}
	}
}

优化:上面的代码中,查找无序区中的最小值我们写了一个for循环完成,其实这里还可以优化。我们可以再这里同时查找最小值和最大值,最后将最小值放到前面的位置,最大值放到后面的位置。

根据上面的分析,可以写出如下代码:

void SelectSort(int *arr, int len)
{
	int left = 0;
	int right = 0;
	int j = 0;
	int tmp = 0;
	int max = 0;
	int min = 0;
	for (left=0,right=len-1 ; left<right ;  right--,left++)
	{
		min =left;
		max = left;
		for (j = left + 1; j <=right; j++)
		{
			if (arr[j] < arr[min])   //寻找无序区最小的元素的下标
			{
				min = j;
			}
			if (arr[j]> arr[max])   //寻找无序区最大的元素的下标
			{
				max= j;
			}
		}
		if (min!= left)              //如果寻找的最小元素下标不等于有序区最后一个元素下标则交换
		{
			tmp = arr[left];
			arr[left] = arr[min];
			arr[min] = tmp;
		}
		if (max == left)        //如果最大元素的下标是有序区最后一个元素的下标,此时min存放的最大值
		{
			max = min;           //将max置为最大值
		}
		if (max !=right)   //如果max没在无序区右边,则将max对应的值放在右边
		{
			tmp = arr[right];
			arr[right] = arr[max];
			arr[max] = tmp;
		}
	}
}

时间: 2024-10-02 11:31:34

排序--SelectSort优化的相关文章

排序算法进阶--排序算法优化

排序算法进阶 上篇文章中我们主要介绍了经典的八大排序算法,从算法思想,动图演示,代码实现,复杂度及稳定性分析等角度进行学习.还没阅读的童鞋可以点这里进行浏览. 求知若渴的你肯定不会满足于入门的内容,今天,小编在上一篇的基础上,对多种排序算法进行优化,让我们一起来康康吧~~ 01冒泡排序 1. 优化一 优化思路:优化外层循环,我们知道,冒泡排序的每一轮都会对未排序部分进行一次遍历,如果在某次循环中没有交换操作,就说明数组已经有序,不用继续排序. 实现代码 1 public static int[]

百万数据排序:优化的选择排序(堆排序)

  前一篇给大家介绍了<必知必会的冒泡排序和快速排序(面试必知)>,现在继续介绍排序算法          本博文介绍首先介绍直接选择排序,然后针对直接选择排序的缺点改进的"堆排序",堆排序非常适合:数组规模非常大(数百万或更多) + 严格要求辅助空间的场景.   直接选择排序 (一)概念及实现 直接选择排序的原理:将整个数组视为虚拟的有序区和无序区,重复的遍历数组,每次遍历从无序区中选出一个最小(或最大)的元素,放在有序区的最后,每一次遍历排序过程都是有序区元素个数增加,

排序算法ONE:选择排序SelectSort

1 /** 2 *选择排序: 3 * 对冒泡排序的一个改进 4 * 进行一趟排序时,不用每一次都交换,只需要把最大的标示记下 5 * 然后再进行一次交换 6 */ 7 public class SelectSort 8 { 9 /** 10 *选择排序主方法 11 * 12 */ 13 public static void selectSort(int[] resouceArr) 14 { 15 for(int i = resouceArr.length - 1 ; i >= 0 ; i-- )

排序--InsertSort优化

InsertSort:(以升序为例) 插入排序的基本思想是: 每次将一个待排的记录,按照其关键字的大小,插入到前面已经排好序的有序区中适当的位置,直到全部记录插入完毕为止. 假设待排序的记录存放在数组R[0..n]中,初始时R[0]是一个有序区,R[1..n]是无序区,从i=1开始,依次将R[i]插入到有序区R[0..i-1]中,生成一个包含n个记录的有序区. 根据插入排序的思想,我们可以写出如下代码: void InsertSort(int *arr , int len) { int i =

选择排序SelectSort

/** * * @author Administrator * 功能:选择排序法 */ package com.test1; import java.util.Calendar; public class SelectSort { public static void main(String[] args) { // TODO Auto-generated method stub //int[] arr = { 1, 6, 0, -1, 9, -100, -90 }; int[] arr = n

mysql 两表联查分页排序效率优化

数据库中有两张表 t1 存储消息信息 +-----------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI |

简单选择排序SelectSort

package com.cc.dataconsttuct.com; /*** * 简单选择排序:令A[0,n-1]有n个数据元素的数组,将数组A排列为一个非降序的有序数组: * 算法:首先在n个元素中找到最小元素,将其放在A[0]中,然后将剩下的n-1个元素中找到最小的放在A[1]中,这个过程不断进行下去.... * @author caocx * */public class SelectSort { public static void main(String[] args) { // TO

选择排序及选择排序的优化

package com.Summer_0421.cn; import java.util.Arrays; /** * @author Summer * 选择排序 * 通过记录下标值,优化选择排序 */ public class Test06 { public static void main(String[] args) { int[] array = {18, 34, 79, 62, 59, 15, 39, 75, 62, 10}; System.out.println(Arrays.toSt

排序-计数-优化版

计数排序优化版:引用:https://www.cnblogs.com/xiaochuan94/p/11198610.html基础版能够解决一般的情况,但是它有一个缺陷,那就是存在空间浪费的问题.比如一组数据{101,109,108,102,110,107,103},其中最大值为110,按照基础版的思路,我们需要创建一个长度为111的计数数组,但是我们可以发现,它前面的[0,100]的空间完全浪费了,那怎样优化呢?将数组长度定为max-min+1,即不仅要找出最大值,还要找出最小值,根据两者的差来