Java数据结构之排序---选择排序

简单选择排序的介绍:

从给定的序列中,按照指定的规则选出某一个元素,再根据规定交换位置后达到有序的目的。

简单选择排序的基本思想:

假定我们的数组为int [] arr = new int[n],第一次我们从arr[0]~arr[n-1]中选择出最小的值与arr[0]交换。第二次我们从arr[1]~arr[n-1]中选择出最小的值与arr[1]交换。第三次我们从arr[2]~arr[n-1]中选择出最小的值与arr[2]交换,...,第i次我们从arr[i-1]~arr[n-1]中选择出最小的值与arr[i-1]交换,...,第n-1次我们从arr[n-2]~arr[n-1]中选择出最小的值与arr[n-2]交换。我们总共进行n-1次的交换,从而得到一个由小到大的排序序列。

简单选择排序的思路详解:

例子:原始的数组:[101,34,119,1]

经过第一次选择排序之后,我们得到的数组:1,[34,119,101]

经过第二次选择排序之后,我们得到的数组:1,34,[119,101]

经过第三次选择排序之后,我们得到的数组:1,34,101,[119]

这个时候,我们的序列已经有序了,并且我们执行的次数一共是是4次(n-1)。

针对上述的例子我们进行说明如下:

(1).选择排序一共有数组大小-1(n-1)轮排序

(2).每一轮排序,又是一个循环,我们先假定每次循环的第一个数都是最小的数,然后和后面的每个数进行比较,如果发现有比当前更小的数,就重新确定这个最小的数,并且要得到这个数的下标。依次进行循环

上述过程在代码中我会通过注释说明。

下面的代码中,我会将选择排序通过两种代码实现:分步骤的实现,整体的实现。在代码中,我们测试的数组是:[101,34,119,1]

(1).分步骤的实现选择排序

public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr = {101,34,119,1};
		selectSort(arr);
	}

	//选择排序
	public static void selectSort(int[] arr){
				//第一趟排序
				System.out.println("执行的第一趟排序:");
				//首先我们要假设第一个元素是最小的,并且记录最小元素的下标,这里我们分别用min,minIndex表示。
				int min = arr[0];
				int minIndex = 0;
				for(int j = 1+0;j<arr.length;j++){   //这是第一次的循环,我们要从第二个数开始算起,与第一个数比较。
					if(min>arr[j]){  //当我们的min值大于后面的数时,说明min不是最小的,这时候,我们将min与最小的值交换,并且让minIndex索引变成最小值的索引。
						min = arr[j];
						minIndex = j;
					}
				}
				//通过上面的交换,我们可以得到这趟序列中最小的元素的值。
				//因为我们的第一个元素是我们指定的最小元素,因此在找到比第一个元素更小的元素后,我们应该让其与第一个元素交换。
				arr[minIndex] = arr[0];
				arr[0] = min;
				System.out.println(Arrays.toString(arr));

				//接下来的几趟排序与第一趟相同
				//第二趟排序
				System.out.println("执行的第二趟排序:");
				min = arr[1];
				minIndex = 1;
				for(int j = 1+1;j<arr.length;j++){   //j=1+1这个需要注意,因为是第二趟排序,所以应该加1.
					if(min > arr[j]){
						min = arr[j];
						minIndex = j;
					}
				}
				arr[minIndex] = arr[1];
				arr[1] = min;
				System.out.println(Arrays.toString(arr));

				//第三趟排序
				System.out.println("执行的第三趟排序:");
				min = arr[2];
				minIndex = 2;
				for(int j = 1+2;j<arr.length;j++){
					if(min > arr[j]){
						min = arr[j];
						minIndex = j;
					}
				}
				arr[minIndex] = arr[2];
				arr[2] = min;
				System.out.println(Arrays.toString(arr));
	}

 上述代码我们得到的最终结果是:

(2).整体的代码实现

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr = {101,34,119,1};
		selectSort(arr);
	}

	//选择排序
	public static void selectSort(int[] arr){	

		//选择排序的算法
		//通过上面的分步,我们可以知道,可以通过循环嵌套来实现
		for(int i=0;i<arr.length-1;i++){  //i代表的就是实现该算法的次数。,具体的解释可以看上述代码
			int min = arr[i];
			int minIndex = i;
			for(int j=i+1;j<arr.length;j++){   //j=i+1这个地方就是代表了,j应该从i+1个位置开始算起,因为之前的已经排好序了~
				if(min>arr[j]){
					min = arr[j];
					minIndex = j;
				}
			}
				arr[minIndex] = arr[i];
				arr[i] = min;
			System.out.println("第"+(i+1)+"趟排序的结果:");
			System.out.println(Arrays.toString(arr));

		}

	}

  上述代码我们得到最终的结果是:

但是,还有一点值得注意的是,观察我们第二趟的结果,我们发现与第一趟的结果是相同的,也就是说,我们在进行选择排序的过程中,可能出现第一个数就是最小的数,这样的话我们可以不需要执行交换的代码,因此选择排序的算法我们可以做进一步的优化,优化代码如下(注释里面有解释):

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr = {101,34,119,1};
		selectSort(arr);
	}

	//选择排序
	public static void selectSort(int[] arr){	

		//选择排序的算法
		//通过上面的分步,我们可以知道,可以通过循环嵌套来实现
		for(int i=0;i<arr.length-1;i++){  //i代表的就是实现该算法的次数。,具体的解释可以看上述代码
			int min = arr[i];
			int minIndex = i;
			for(int j=i+1;j<arr.length;j++){   //j=i+1这个地方就是代表了,j应该从i+1个位置开始算起,因为之前的已经排好序
				if(min>arr[j]){
					min = arr[j];
					minIndex = j;
				}
			}
			if(minIndex != i){   //我们通过比较minIndex与i的值来确定是否 最小值发生了改变,如果没有改变,我们不需要执行下面的代码。
				arr[minIndex] = arr[i];
				arr[i] = min;
				System.out.println("第"+(i+1)+"趟排序的结果:");
				System.out.println(Arrays.toString(arr));
			}

		}

	}

  最终得到的结果如下:

原文地址:https://www.cnblogs.com/liuzengzhi/p/11751832.html

时间: 2024-11-03 23:17:37

Java数据结构之排序---选择排序的相关文章

Java数据结构与算法之排序

排序从大体上来讲,做了两件事情: 1.比较两个数据项: 2.交换两个数据项,或复制其中一项 一.冒泡排序 大O表示法:交换次数和比较次数都为O(N*N). 算法原理: 1.比较相邻的元素.如果第一个比第二个大,就交换他们两个. 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 3.针对所有的元素重复以上的步骤,除了最后一个. 4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较. /** * 冒泡排序 demo * */

数据结构 - 只需选择排序(simple selection sort) 详细说明 和 代码(C++)

数据结构 - 只需选择排序(simple selection sort) 本文地址: http://blog.csdn.net/caroline_wendy/article/details/28601965 选择排序(selection sort) : 每一趟在n-i+1个记录中选取keyword最小的记录作为有序序列中第i个记录. 简单选择排序(simple selection sort) : 通过n-i次keyword之间的比較, 从n-i+1个记录中选出keyword最小的记录, 并和第i

01. Java的经典排序--选择排序--冒泡排序--折半查找(二分查找)

Java的经典排序--选择排序--冒泡排序--折半查找 选择排序 选择排序 3 2 1 5 8 0 1 3 2 5 8 1 1 2 3 5 8 2 1 2 3 5 8 3 1 2 3 5 8 public static void main(String[] args) { int[] arr={3,2,1,5,8}; selectSort(arr); for(int i = 0 ; i < arr.length ; i ++){ System.out.println(arr[i]) ; } }

算法大神之路----排序(选择排序法)

选择排序法,顾名思义,就是把特定的数据选择出来进行排序. 选择排序法有两种方式 在所有的数据中,当由大到小排序,那么就将最大值放到第一个位置 如果由小到大排序,那么就将最小值放到第一个位置 以由小到大排序举例,当排序时候,扫描整个数据,拿第一个依次与其他做比较,如果其他数据比第一个大,或者相等,那么就不交换,如果其他数据比第一个数小,那么就交换二者的位置,扫描结束后,则从第二个数开始,依次扫描. 方法分析 无论是最坏还是最好情况,甚至是平均情况下,都需要对全部数据进行扫描,找到最大或最小值,因此

Java数据结构与算法(2) - 排序(冒泡、插入和选择排序)

排序需要掌握的有冒泡排序,插入排序和选择排序. 冒泡排序: 外层循环从后往前,内存循环从前往后到外层循环,相邻数组项两两比较,将较大的值后移. 插入排序: 从排序过程的中间开始(程序从第二个数组项开始a[1]),此时队列已经拍好了一部分.此时,将后边的数组项一次插入到已经排好序的部分队列中. 选择排序: 从第一个数组项开始,找到包括该数组项在内的所有往后数组项中的最小项与当前项进行交换,其实相当于依次将最小值往前冒泡. 示例代码: package chap03.BubbleSort; // bu

Java数据结构系列之——简单排序:冒泡、简单选择、直接插入

package SimpleSort; public class SimpleSort { /** * 冒泡排序:每次循环过程中,小的排在后面的数会像水中的 * 气泡一样慢慢往上冒,所以命名为冒泡排序了,我猜是这样子的..... */ public void BubbleSort(int[] array){ for(int i=0;i<array.length;i++){ for(int j=array.length-1;j>i;j--){//注意此处j是从后往前循环 if(array[j-1

java冒泡算法和选择排序法

1 package test.auto; 2 3 import java.util.Arrays; 4 5 import org.apache.bcel.generic.FieldGenOrMethodGen; 6 7 public class Maopao0807{ 8 9 public static void main(String[] args) { 10 //冒泡,每个相邻进行比较 11 int a[]={ 6, 5, 3, 1, 8, 7, 2, 4 , 0}; 12 for (int

Java实现冒泡排序,选择排序,插入排序

冒泡排序: 思想: 冒泡排序重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说排序完成 特点:比较稳定,排序数较小是比较好 package cn.guangboyuan; /** * @author Red Ants * 微信公众号:程序员之路 * 两种冒泡排序的性能比较 */ public class DubbleSort { private static boolean checkArray(int[] da

数据结构与算法——选择排序

//选择排序#include<stdio.h>void SelectSort(int arr[],int len);int main(void){ int i; int arr[9]={1,4,2,4,6,8,3,9,5}; int len=sizeof(arr)/sizeof(arr[0]); SelectSort(arr,len); for(i=0;i<len;i++) { printf("%d ",arr[i]); }}void SelectSort(int a