冒泡排序
方法一:每趟从第一个元素开始,依次与下一个元素比较,大的往下交换;
方法二:记录交换位置,可以省略下趟不必要的比较(如果后面几个元素已经是有序的,第二趟就直接不用比较这几个元素);
方法三:双向冒泡,正向找最大(从最小元素交换位置处开始比较,找到最大元素并记录交换位置),反向找最小(从最大元素交换位置处开始比较,找到最小元素并记录交换位置).
package com.mahai.sort;
import java.util.Scanner;
public class Bubble {
//TODO 冒泡排序 每趟从第一个元素开始,依次与下一个元素比较,大的往下交换
public static void sort(String[] a) {
int N = a.length;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N-i-1; j++) {
if (less(a[j+1], a[j])) exch(a, j, j+1);
}
}
}
//TODO 方法二:记录交换位置,可以省略下趟不必要的比较(如果后面几个元素已经是有序的,第二趟就直接不用比较这几个元素;如果本来就是有序的,则只要比较N-1次)
public static void sort1(String[] a) {
int N = a.length;
int i = N-1;
while (i > 0) {
int pos = 0;
for (int j = 0; j < i; j++) {
if (less(a[j+1], a[j])) {
exch(a, j, j+1);
pos = j;
}
}
i = pos;
}
}
//TODO 方法三:双向冒泡,正向找最大,反向找最小
public static void sort2(String[] a) {
int N = a.length;
for (int i = 0; i < N/2; i++) {
int posmax = N-1,posmin = 0;
int min = 0,max = N-1;
for (int j = posmin; j < max; j++) {//从最小元素交换位置处开始比较,找到最大元素并记录交换位置
if (less(a[j+1], a[j])) {
exch(a, j, j+1);
posmax = j;
}
}
max = posmax;
if (posmax==N-1) break;
for (int j = posmax; j > min ; j--) {//从最大元素交换位置处开始比较,找到最小元素并记录交换位置
if (less(a[j], a[j-1])) {
exch(a, j, j-1);
posmin = j;
}
}
min = posmin;
if (posmax==1) break;
}
}
//TODO 方法三改进,还可以改进,比如只交换一次说明完成排序了,就没有必要在循环比较......
public static void sort2_1(String[] a) {
int N = a.length;
while (true) {
int posmax = N-1,posmin = 0;
int min = 0,max = N-1;
for (int j = min; j < max; j++) {//从最小元素交换位置处开始比较,找到最大元素并记录交换位置
if (less(a[j+1], a[j])) {
exch(a, j, j+1);
posmax = j;
}
}
max = posmax;
if (max==N-1) break;
for (int j = max; j > min ; j--) {//从最大元素交换位置处开始比较,找到最小元素并记录交换位置
if (less(a[j], a[j-1])) {
exch(a, j, j-1);
posmin = j;
}
}
min = posmin;
if (max==1) break;
else if (max==min) break;
}
}
//TODO 比较数组元素大小
private static boolean less(String c,String d) {
return c.hashCode()<d.hashCode();
}
//TODO 交换数组元素
private static void exch(String[] a,int i,int j) {
String ex;
ex = a[i];
a[i] = a[j];
a[j] = ex;
}
//TODO 判断数组是否顺序
public static boolean isSorted(String[] a) {
for (int i = 1; i < a.length; i++) {
if (less(a[i], a[i-1])) return false;
}
return true;
}
//TODO 显示数组
private static void show(String[] a) {
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
System.out.println();
}
//TODO main方法
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("请输入数组长度:");
int n = s.nextInt();
System.out.println("请输入数组成员:");
String[] a = new String[n];
for (int i = 0; i < n; i++) {
System.out.println("请输入第" +(i+1)+"个数组成员:");
a[i] = s.next();
}
s.close();
System.out.println("输入完毕!");
show(a);
sort2(a);
System.out.println(isSorted(a));
show(a);
}
}