冒泡排序 (三种方法)

 冒泡排序    

         方法一:每趟从第一个元素开始,依次与下一个元素比较,大的往下交换;

         方法二:记录交换位置,可以省略下趟不必要的比较(如果后面几个元素已经是有序的,第二趟就直接不用比较这几个元素);

         方法三:双向冒泡,正向找最大(从最小元素交换位置处开始比较,找到最大元素并记录交换位置),反向找最小(从最大元素交换位置处开始比较,找到最小元素并记录交换位置).

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

猜你喜欢

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