选择排序
选择排序的算法
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()方法进行比较。
快速排序是冒泡排序的完善版,都是基于交换的排序,是各种基于比较的排序算法中效率最高的,用到了分治和递归的思想。