`
holoblog
  • 浏览: 1270531 次
博客专栏
E0fcf0b7-6756-3051-9a54-90b4324c9940
SQL Server 20...
浏览量:19636
文章分类
社区版块
存档分类
最新评论

算法基础遍之选择排序算法详解

 
阅读更多

之前为大家讲解了一个简单的二分法数组查找算法,一笔触而无法停止,看看时间也不算怎么晚,就再给大家讲解一个排序的算法把,在这里我讲解的是选择排序,也是最简单与最基础的排序方法,我想这些简单与基础的你把它耳熟能详了,后面对稍微复杂的算法相对来说也不会有太多的问题,OK,废话少说,跟到思路一步一步的走吧:

这里需要注意的是,不管你做什么,首先你需要去思考做你所需要做的前提是什么,以至于它所可能产生的问题是什么,这是必要的,算法嘛,不就是一个思考问题的过程吗,即一个逻辑的实现过程,所以我要写这样一个算法,首先就得考虑,这个算法能达到的效果是什么,好了,我在这里就单针对一个对无序数组进行排序来讲解吧:

首先,我需要定义一个数据:int[] arr = new int[]{2,4,7,4,8,3,2,4,1,4,0,6,4,3,2,6,77,43,232,43};它是无序的

其次,我们需要对其数据做排序,以便成为有序的数组,在这里,我们需要思考,我们该怎么去对这个数组进行排序呢,如果我们以小到大的顺序排序或者是大到小的排序都需要对其位置进行两次以上的交换来轮询操作,如在数组中a[0]=2,a[1]=4,相对来说在数组中a[10]=0是最小的,这里就需要有两个循环进行操作,首先是在第一层循环数组长度为:for(int i=0;i<arr.length-1;i++){},这样来一次可以对所有数组都进行一次取值来做比较,当然在这里要假设第一个取值就是最小值,所以需要对其最小值进行保存起来:int min = i;在第一层循环中我们只需要循环都倒数第一个对其比较即可,因为在最后一个比较时是自己跟自己进行比较,所以没必要,不然的话会增加计算过程,从而降低其效率,其次就是我们在固定第一层循环选值后会对当前值与其下一个值进行对比,如:a[0]需要与a[1]进行对比,如a[0]大于a[1]的话,就需要对其值位置进行交换,然而这是轮询的,也就是说这种对比交换方式是依次都会对比一次,因为可能最小的值在这个数组的最后,所以就需要依次轮询对比并进行交换后才能判断得出它的最小值老保存:for(int j=i;j<arr.length;j++){},再次就是需要在第二层对比后进行判断,if(arr[min] > arr[j])时就需要对其位置进行交换:min = j;这是交换下标的位置,所以就需要对其保存后对其值的位置进行交换:if(min != i){int tmp=arr[i];arr[i]=arr[min];arr[min]=tmp;}这里我们对其算法进行优化,也就是说当min不等于i时才进行位置交换,否则就没必要进行交换了,因为在这里最小的小表与这min的下标本身就是同一个下标,所以就不需要进行罗列了,然后不等时就设定一个临时变量对其初始对比值进行保存,这是在当我们对比的结果a[n-1]>a[n]时需要对其位置进行交换,并把大的那个数使用临时位置进行保存,把小的数进行前移,然后再把放在临时文件里的那个数放在已经前移后的那个数据的位置,依次来进行轮询对比就可以得到外层第一次循环后内层多次循环比较出来的结果并置于最小值为最前位,当外层循环第二次循环的时候就从a[1]开始了,一次对内层循环进行比较,个得到第二个最小值,知道外层循环依次到最后一个循环位置,这样就可以得到我们想要的数组排序结果了,OK,上面说的是以小到大的排序方式来做的,如果想要实现大到小的方式来排序的话我想这我拘没必要再说了吧,下面我把完整的代码写在下面,并顺以面向对象方式优化后进行展示:

public class SelectionSort{

public static void main(String args[]){

int[] arr = new int[]{3,4,7,2,23,3,4,5,66,7,89,43,23,2,2,43,67,8,9};

selectionSort(arr);

}

private static int selectionSort(int[] arr){

for(int i=0;i<arr.length-1;i++){

int min = i;

for(int j=i;j<arr.length;j++){

if(arr[min] > arr[j]){

min = j;

}

}

if(min != i){

int tmp = arr[i];

int arr[i] = arr[min];

int arr[min] = tmp;

}

System.out.println("第"+i+"次");

for(int ele:arr){

System.out.println(ele+"/t");

}

System.out.println(" ");

}

System.out.println("最终: ");

for(int ele:arr){

System.out.println(ele);

}

return 0;

}

}

以上就是完整的源代码,只是这个实现都是在一个方法中执行的,如果这个方法你需要处理很多的数据的话,那样这个方法相对来说是比较膨胀的,所以我们要对其重构:

public class ReconstructionSelectionSort{

public static void main(String args[]){

int[] arr = new int[]{3,4,7,2,23,3,4,5,66,7,89,43,23,2,2,43,67,8,9};

selectionSort(arr);

}

public static int selectionSort(int[] arr){

for(int i=0;i<arr.length;i++){

int min = i;

for(int j=i;j<arr.length;j++){

min = innerSort(arr,min,j);

}

swap(arr,i,min);

showArray("第"+i+"次",arr);

}

showArray("最终:",arr);

}

public staticvoid showArray(int i,int[] arr){

System.out.print(i);

for(int ele:arr){

System.out.println(ele+"/t");

}

System.out.println(" ");

}

public static void swap(int[] arr,int i,int min){

if(i!=min){

int tmp = arr[i];

arr[i] = arr[min];

arr[min] = tmp;

}

}

public static int innerSort(int[] arr,int min,int j){

if(arr[min]>arr[j]){

min = j;

}

return min;

}

}

以上就是重构过后的代码,希望能给初学者提供最详细与完整的讲解,如果有问题,自己来邮,本人会第一次回复:jiangshide@hotmail.com

分享到:
评论

相关推荐

    java基础 经典算法之冒泡排序详解

    1.冒泡排序的原理:每次都从第一个元素开始(索引0),向后两两比较,只要后面的比前面的大,就交换(从大到小) 2.通过画图分析,5个数字排4趟,n数字排n-1趟,而外层的for循环代表的是循环的趟数,所以外层循环的结束条件是...

    12种排序算法详解(寒小阳博客转出PDF版)

    插入排序(Insertion Sort)是最基础和简单的排序算法之一,它基于一种简单直观的排序思路:将数组分为已排序和未排序两个部分,每次从未排序部分取出一个元素,与已排序部分的元素逐一比较,找到合适的位置进行插入...

    经典7大排序算法详解

    ### 经典七大排序算法详解 #### 一、冒泡排序 冒泡排序是一种简单的排序算法,通过重复地遍历列表,比较每对相邻元素,若顺序错误则交换它们。遍历列表的工作会重复进行直到没有更多的交换需要,也就是说列表已经...

    java排序算法

    ### Java排序算法详解 在Java编程中,排序算法是数据结构与算法中不可或缺的一部分,它不仅能够帮助我们理解和处理数据,还能提升程序的性能。本文将深入探讨Java中常见的几种基本排序算法,包括插入排序、交换排序...

    详解Java常用排序算法-选择排序

    详解Java常用排序算法-选择排序 选择排序(Selection Sort)是一种简单的排序算法,它的基本思想是每次从待排序的元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的元素排完。 选择...

    C#排序算法详解.rar

    本资料“C#排序算法详解”聚焦于如何在C#中实现各种排序算法,帮助学习者深入理解并提升编程技能。 1. **冒泡排序**:冒泡排序是一种简单的排序算法,通过重复遍历数组,比较相邻元素并交换位置来完成排序。C#实现...

    MoreWindows白话经典算法之七大排序第2版(高清)

    本书《更多Windows白话经典算法之七大排序第2版》是一部深入浅出讲解七种经典排序算法的著作,旨在帮助读者理解并掌握冒泡排序、直接插入排序、直接选择排序、希尔排序、归并排序、快速排序以及堆排序等基本概念和...

    常用排序查找算法详解

    "线性排序算法--基数排序"是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。这种方法尤其适合处理大数据量且位数较少的情况。 接下来,我们转向查找算法。"红黑树 [RBT...

    用javascript实现的十大排序算法详解

    在编程领域,排序算法是计算机科学的基础之一,它在数据处理和分析中起着至关重要的作用。本篇文章将深入探讨如何使用JavaScript实现十大经典排序算法,帮助开发者更好地理解和运用这些算法。 1. 冒泡排序(Bubble ...

    Python排序算法详解

    冒泡排序是最基础的排序算法之一,通过不断交换相邻的逆序元素来逐步排序。它的主要步骤是:遍历数组,比较每对相邻元素,如果它们的顺序错误就交换位置。这个过程会重复进行,直到没有更多的交换,即数组完全有序...

    排序算法详解:直接插入排序及其Python实现

    使用场景及目标:适用于小规模数据集或接近有序的数据集排序,是理解更复杂排序算法(如希尔排序)的基础。 其他说明:通过本文的学习,读者可以深入理解排序算法的实现细节和性能特点,掌握 Python 代码实现技能。

    排序及基本算法

    #### 二、内部排序算法详解 内部排序算法主要可以分为以下几类: 1. **插入排序**:包括直接插入排序、希尔排序、二分法插入排序等。插入排序的基本思想是从第二个元素开始,将每个元素插入到已排序序列的适当位置...

    Python实现常见排序算法详解

    内容概要:本文详细介绍了几种常见的...适用于初学者学习算法基础知识,以及开发者在实际项目中选择合适的排序算法。 其他说明:文章内容结构清晰,每个算法的实现代码简洁明了,适合初学者和有一定基础的学习者参考。

    外部排序算法详解

    本PPT详细讲解了外部排序算法,讲解言简意赅,深入浅出,想了解外部排序算法的朋友可以下载阅读。

    JAVA冒泡排序算法详解

    ### JAVA冒泡排序算法详解 冒泡排序是一种简单的排序算法,它重复地遍历要排序的元素列表,比较每对相邻元素,如果它们的顺序错误就把它们交换过来。遍历列表的工作是重复进行的,直到没有再需要交换的元素,也就是...

    直接插入排序-算法领域中直接插入排序算法详解与Python实现

    内容概要:本文详细介绍了直接插入排序的基本原理及其Python实现。该算法通过逐个元素从已排序部分找到相应位置并插入,完成整个序列的...同时,对于算法性能的分析也有助于读者在选择排序算法时做出更加合适的选择。

    C++排序算法之选择排序源码

    ### C++选择排序算法详解 #### 一、概述 选择排序是一种简单直观的比较排序算法。它的基本思想是:在未排序序列中找到最小(或最大)元素放到已排序序列的末尾。此过程不断重复直到整个序列有序。本文将详细介绍...

    Python排序算法详解及实现

    内容概要:本文详细介绍了几种常用的排序算法,包括冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、计数排序、桶排序和基数排序。文章不仅解释了每种排序算法的基本原理和时间复杂度,还提供了相应的 ...

    java实现数据结构常见排序算法及详解

    排序算法是计算机科学中的基础概念之一,主要用于将一系列数据按照特定规则进行排列。根据数据处理方式的不同,排序算法大致分为两大类:比较排序与非比较排序。 #### 比较排序 比较排序是指通过比较两个元素的大小...

    JavaScript 中常见排序算法详解.pdf

    JavaScript 中常见排序算法详解

Global site tag (gtag.js) - Google Analytics