插入排序算法(两种,不包括希尔排序)

 基本插入排序

              从数组中第二个元素开始,与之前的元素比较,比较小的话就直接交换位置,再与前面的元素比较、交换........直到最后一个数组元素。

       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);
		}
	}

猜你喜欢

转载自blog.csdn.net/a214704/article/details/81086997