选择排序算法(两种)

简单的选择排序

             从第一个元素开始跟剩余的所有元素比较,找出剩余元素中最小(最大)的元素位置,然后再交换开始元素位置与最小(最大)元素位置的值。(不断地选择剩余元素中的最小者)

        特点:

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

}

 

猜你喜欢

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