简单的选择排序
从第一个元素开始跟剩余的所有元素比较,找出剩余元素中最小(最大)的元素位置,然后再交换开始元素位置与最小(最大)元素位置的值。(不断地选择剩余元素中的最小者)
特点:
1.运行时间与输入无关;
2.数据移动是最少的;
3.N次交换,N(N-1)/2次比较。
package com.mahai.sort;
import java.util.Scanner;
/**
*TODO 选择排序
*/
public class Selection {
public static void sort(String[] a) {// TODO 排序 从小到大
/**
* TODO 简单的选择排序
*/
for (int i = 0; i < a.length; i++) {
int min = i;
for (int j = i + 1; j < a.length; j++)
if (less(a[j], a[min]))
min = j;
exch(a, i, min);
}
}
}
// TODO 比较
/**
* TODO 简单选择排序比较方法
*/
private static boolean less(String v, String m) {
if (v.hashCode()<m.hashCode()) return true;
return false;
}
private static void exch(String[] a, int i, int j) {// TODO 交换
String t;
t = a[i];
a[i] = a[j];
a[j] = t;
}
public static boolean isSorted(String[] a) {// TODO 判断数组是否是有序的
for (int i = 1; i < a.length; i++) {
if (less(a[i], a[i - 1]))
return false;
}
return true;
}
private static void show(String[] a) {// TODO 输出数组
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
System.out.println();
}
public static void main(String[] args) {
String input = null;
Scanner s = null;
try {
s = new Scanner(System.in);
input = s.nextLine();
} catch (Exception e) {
e.printStackTrace();
} finally {
s.close();
}
String[] a = new String[input.length()];
for (int i = 0; i < input.length(); i++)
a[i] = input.substring(i, i + 1);
show(a);
sort(a);
System.out.println(isSorted(a));
show(a);
}
}
二元选择排序
package com.mahai.sort;
import java.util.Scanner;
/**
*TODO 选择排序
*/
public class Selection {
public static void sort(String[] a) {// TODO 排序 从小到大
/**
* TODO 二元选择排序 每趟循环确定两个元素
*/
int n = a.length;
for (int i = 0; i <= n/2; i++) {
int min = i;
int max = i;
for (int j = i+1; j < n-i; j++) {
if (less1(a[j], a[max])==1){
max = j;
} else if (less1(a[j], a[max])==0){
max = j;
if (less1(a[j], a[min])==0) {
min = j;
}
} else if (less1(a[j], a[min])==-1) {
min = j;
}
}
String minv = a[min];
exch(a, n-1-i, max);
if (a[min]==minv) {//如果最小的元素定位到n-1-i此位置的话,上一句程序就会将最小元素交换到max位置
exch(a, i, min);
} else {
exch(a, i, max);
}
}
//方法二
for (int i = 0; i < n/2; i++) {
int min = i;
int max = i;
for (int j = i + 1; j < a.length; j++)
if (less(a[j], a[min])) {
min = j;
} else if (less(a[max], a[j])) {
max = j;
}
String minv = a[min];
exch(a, n-1-i, max);
if (a[min]==minv) {//如果最小的元素定位到n-1-i此位置的话,上一句程序就会将最小元素交换到max位置
exch(a, i, min);
} else {
exch(a, i, max);
}
}
}
// TODO 比较
/**
* TODO 二元选择排序比较方法
*/
private static int less1(String c,String d)
{
if (c.hashCode()<d.hashCode())
{
return -1;
} else if (c.hashCode()>d.hashCode()) {
return 1;
} else {
return 0;
}
}
private static void exch(String[] a, int i, int j) {// TODO 交换
String t;
t = a[i];
a[i] = a[j];
a[j] = t;
}
public static boolean isSorted(String[] a) {// TODO 判断数组是否是有序的
/**
* 二元选择排序判断方法
*/
for (int i = 1; i < a.length; i++) {
if (less1(a[i], a[i - 1])==-1)
return false;
}
return true;
}
private static void show(String[] a) {// TODO 输出数组
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
System.out.println();
}
public static void main(String[] args) {
String input = null;
Scanner s = null;
try {
s = new Scanner(System.in);
input = s.nextLine();
} catch (Exception e) {
e.printStackTrace();
} finally {
s.close();
}
String[] a = new String[input.length()];
for (int i = 0; i < input.length(); i++)
a[i] = input.substring(i, i + 1);
show(a);
sort(a);
System.out.println(isSorted(a));
show(a);
}
}