选择排序

选择排序的算法

1) 整个数列分成两部分:前面是有序数列,后面是无序数列

2) 初始状态下,整个数列都是无序的,有序数列是空

3) 一共n个数,需要n-1趟循环(一趟都不能少)

4) 每比较完一趟,有序数列数量+1,无序数列数量-1

5) 每趟先假设无序数列的第1个元素(整个数列的第i个元素)是最小的,让当前的最小数,从第i+1个元素开始比较,一直比较到最后一个元素。如果发现更小的数,就假设当前数是最小数。

6) 一趟比较完后,将发现最小数和无序数列的第一个数交换(如果最小数不是无序数列的第一个数)

 

实现

import java.util.Arrays;
import java.util.jar.JarEntry;

public class slelectsort {

    public static void main(String[] args) {
        int[] arr= {75,87,56,45,89,100,76,34,89,97};

        //排序前输出
        System.out.println(Arrays.toString(arr));

        //冒泡排序

        for (int i=0;i<arr.length-1;i++){
           //1.假设第一个无序数列第一个数是最小的
            int minIndex=i;
            //2.小循环
            for(int j=i+1;j<arr.length;j++){
                if(arr[minIndex]>arr[j]){
                    minIndex=j;
                }
            }
            //3.判断minIndex是否变化,如果变化了就说明数列第一个不是最小的,就交换
            if(minIndex!=i){
                int temp=arr[minIndex];
                arr[minIndex]=arr[i];
                arr[i]=temp;
            }


        }

        //输出排序后
        System.out.println("排序后");
        System.out.println(Arrays.toString(arr));

    }
}

 冒泡排序最多需要n-1趟循环,最少1趟循环;选择排序必须进行n-1趟循环,一趟也不能少

 冒泡排序中最多的操作就是比较和交换,一趟循环中可能发生多次交换;而选择排序中最多的操作是比较,一趟比较结束后如果发现更小的值才交换一次。

 如果数组元素不是基本数据类型,而是对象,应该如何判断大小呢?可以让相应类实现Comparable接口并调用comparTo()方法进行比较。

 快速排序是冒泡排序的完善版,都是基于交换的排序,是各种基于比较的排序算法中效率最高的,用到了分治和递归的思想。

原文地址:https://www.cnblogs.com/vincentmax/p/14240906.html