基本插入排序
从数组中第二个元素开始,与之前的元素比较,比较小的话就直接交换位置,再与前面的元素比较、交换........直到最后一个数组元素。
1 判断输入数组元素是否重复,输入数组长度是否是大于零的正整数
2 提速版插入排序 不需要交换元素,大元素往右移
package com.mahai.sort;
import java.util.Scanner;
import java.util.regex.Pattern;
public class Insertion {
//TODO 插入排序住方法
public static void sort(String[] a) {
int n = a.length;
for (int i = 1; i <n; i++) {
for (int j = i; j > 0 && less(a[j], a[j-1]); j--) {
exch(a, j, j-1);
}
}
/**
* TODO 提速版插入排序 不需要交换元素,大元素往右移
*/
for (int i = 1; i < n; i++) {
String ini = a[i];
int j;
for (j = i; j > 0 && less(ini, a[j-1]); j--) {
a[j] = a[j-1];
}
a[j] = ini;
}
}
//TODO 比较方法
private static boolean less(String c,String d) {
return c.compareTo(d) < 0;
}
//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 判断输入数组长度是否为空
private static boolean isArrlnull(String[] a,String n,Scanner s) {
if (n==""||n==null) {
return true;
} else if (isNumeric(n)) {
while (!isGreaterz(a,n, s)) {
System.out.println("请输入长度大于0的数字:");
n = s.next();
}
return false;
} else {
return false;
}
}
//TODO 判断是否是整数
public static boolean isNumeric(String str){
Pattern pattern = Pattern.compile("[0-9]*");
if (pattern.matcher(str).matches()) {
return true;
} else {
return false;
}
}
//TODO 判断数组长度是否是大于零
private static boolean isGreaterz(String[] a,String n,Scanner s) {
if (Integer.parseInt(n)<=0) {
return false;
} else {
inputArrel(a, n, s);
System.out.println("数组输入完毕!");
return true;
}
}
//TODO 判断输入数组元素是否符合条件
private static void inputArrel(String[] a1,String n,Scanner s) {
System.out.println("请输入数组元素:");
for (int i1 = 0; i1 < Integer.parseInt(n); i1++) {
a1[i1] = s.next();
while (a1==null) {
System.out.println("您输入的数组元素不符合条件,请重新输入数组元素:");
inputArrel(a1, n, s);
}
if (isSame(a1,i1,s)) {
System.out.println("不能输入相同数组元素!/n请重新输入另一个数组元素:");
inputArrel(a1, n, s);
}
}
// System.out.println("数组输入完毕!");//放在这块出现重复之后,第二次输入完成后就会输出两遍,而71行只会输出一次
}
//TODO 判断数组是否有相同元素
private static boolean isSame(String[] a,int i1,Scanner s) {
for ( int j = 0; j < i1 && i1 > 0; j++) {
/**
* “==”是一个判断相等的运算符,
* 如果两边是基本数据类型,它判断的是值;
* 如果两边是复合型数据类型(类类型), 它判断的是地址;地址相同,内容一定相同,地址不同,内容不一定相同。
* equals() 方法只能判断复合型数据类型,由于继承Object类,默认判断的是两边在内存的地址,判断结果和“==”一样,
* 但在一些其他的类库中equals()被重写,例如String,Integer,Data等类中有其自身的实现,比较内容就不是地址了。
*/
if (a[i1].compareTo(a[j])==0) {//字符串比较直接用a[j]==a[j2]总是返回false
return true;
}
}
return false;
}
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("请输入数组长度:");
String n = s.next();
String[] a1 = new String[Integer.parseInt(n)];
while (isArrlnull(a1,n, s)) {
System.out.println("请重新输入数组长度:");
n = s.next();
}
s.close();
show(a1);
sort(a1);
System.out.println(isSorted(a1));
show(a1);
}
}