算法——选择排序
//选择排序:从0下标开始,与其右侧数据中最小的数据比较
package com.algorithm.sort; import java.util.Scanner; /** * 选择排序: * 需要大约N*N/2次比较和N次交换 * 特点:1.运行时间和输入无关;2.数据移动是最少的。 */ public class Selection { /** * 排序代码 * @param a */ public static void sort(Comparable[] a) { //升序排列 int N = a.length; for(int i=0; i<N; i++) { int min = i;//最小元素索引 for(int j=i+1;j<N;j++) { if(less(a[j],a[min])) { min = j; } } exch(a,i,min); } } /** * 判断v是否小于w,若小于返回true * @param v * @param w * @return */ private static boolean less(Comparable v,Comparable w) { /* *compareTo() 方法用于两种方式的比较: 1.字符串与对象进行比较。2.按字典顺序比较两个字符串。 * *如果参数字符串等于此字符串,则返回值 0; 如果此字符串小于字符串参数,则返回一个小于 0 的值; 如果此字符串大于字符串参数,则返回一个大于 0 的值。 * */ return v.compareTo(w) < 0; } /** * a[i]和a[j]交换 * @param a * @param i * @param j */ private static void exch(Comparable[] a, int i, int j) { Comparable t = a[i]; a[i] = a[j]; a[j] = t; } /** * 打印数组 * @param a */ private static void show(Comparable[] a) { for(int i = 0; i<a.length;i++) { System.out.print(a[i] + " "); } } /** * 判断数组原始是否有序 * @param a * @return */ public static boolean isSorted(Comparable[] a) { for(int i = 1; i<a.length;i++) { if(less(a[i],a[i-1])) { return false; } } return true; } public static void main(String[] args) { String[] a = new String[3]; Scanner in = new Scanner(System.in); for(int i=0;i<a.length;i++) { a[i] = in.next(); } sort(a); System.out.println(isSorted(a)); show(a); } }
以上代码等同于下列代码,升序排列字符
public static void main(String[] args) { String[] a = {"d","g","c","b","f","e","a"}; for(int i=0;i<a.length;i++) { int min = i;//最小字符的下标 for(int j=i+1;j<a.length;j++) {//每次取第一个字符,与后边的字符比较取小值 if(a[min].compareTo(a[j]) > 0) { min = j; } } String temp = a[i]; a[i] = a[min]; a[min] = temp; } for(int i=0;i<a.length;i++) { System.out.println(a[i]); } }

浙公网安备 33010602011771号