算法学习(一) 基本的排序算法 选择 插入 希尔

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_23013309/article/details/79728174

选择排序、插入、希尔排序,是最基本的排序算法。原理简单,实现容易


选择排序的原理是,把一个待排序数组看成是未排序部分,与有序部分,每次在未排序部分选择最大(小)的元素插入有序部分的最后一个位置,当未排序部分长度为0时,整个数组有序,排序结束。

选择排序:

public class SelectSort {
	//sort
	public static <T extends Comparable<? super T>> void sort(T [] arr){
		int minIndex = 0;
		for(int i=0; i<arr.length; i++) {
			minIndex = min(arr, i);
			ex(arr, i, minIndex);
		}
	}
	
	//exchange 
	private static <T extends Comparable<? super T>> void ex(T [] arr, int index1, int index2){
		if (index1 == index2 ) return;
		T temp = arr[index1];
		arr[index1] = arr[index2];
		arr[index2] = temp;
	}
	
	//compare
	private static <T extends Comparable<? super T>> int compare(T c1, T c2){
		return c1.compareTo(c2);
	}
	
	//find min 也可以根据需要改为最大值
	private static <T extends Comparable<? super T>> int min(T [] arr, int start){
		int minIndex = start;
		for (int i=start; i<arr.length; i++) {
			if(compare(arr[i], arr[minIndex]) < 0) {
				minIndex = i;
			}
		}
		
		return minIndex;
	}
	
	private static <T extends Comparable<? super T>> void print(T [] arr){
		System.out.print("array is : ");
		for (int i=0; i<arr.length; i++){
			System.out.print(arr[i] + " ");
		}
		System.out.println();
	}
	public static void main(String [] args){
		People p1 = new People("mfkcel", 25);
		People p2 = new People("mdfdel", 23);
		People p3 = new People("dsfsd el", 20);
		People p4 = new People("cccl", 15);
		People p5 = new People("dddd", 28);
		People p6 = new People("eel", 32);
		People p7 = new People("cefd", 44);
		People p8 = new People("kio", 22);
		People p9 = new People("ytu", 8);
		People p10 = new People("jhjj", 15);
		
		People [] ps = {p1, p2, p3, p4, p5, p6, p7, p8, p9, p10};
		System.out.println("before sort:");
		print(ps);
		sort(ps);
		System.out.println("after sort:");
		print(ps);
	}
	
	//用于测试的嵌套类
	public static class People implements Comparable<People> {
		public int age;
		public String name;
		public People (String name, int age) {
			this.name = name;
			this.age = age;
		}
		public int compareTo(People p){
			People p1 = (People)p;
			if (this.age < p1.age) return -1;
			else if(this.age > p1.age) return 1;
			else return 0;
		}
		
		public String toString(){
			return name + ":" + age;
		}
	}
}


插入排序的原理是,把一个待排序数组看成是未排序部分,与有序部分,每次把未排序部分的第一元素插入有序部分适当位置,当未排序部分长度为0时,整个数组有序,排序结束。

插入排序:

public class InsertSort{
	/*
	insertsort  2018.3.17
	*/
	public static void sort (Comparable [] arr) {
		int result = 0;
	    //j=i+1,所以i的取值上限是arr.length-1,数组一定注意它的边界,特别是有多个index时
		for (int i=0; i<arr.length-1; i++) {
			for (int j=i+1; j>0; j--) {
				result = compare(arr[j], arr[j-1]);
				if (result >= 0) { break; }
				else if (result < 0) { ex(arr, j, j-1); }
			}
		}
	}
	
	//exchange 
	private static void ex(Comparable [] arr, int index1, int index2){
		if (index1 == index2 ) return;
		Comparable temp = arr[index1];
		arr[index1] = arr[index2];
		arr[index2] = temp;
	}
	
	//compare
	private static int compare(Comparable c1, Comparable c2){
		return c1.compareTo(c2);
	}
	
	private static void print(Comparable [] arr){
		System.out.print("array is : ");
		for (int i=0; i<arr.length; i++){
			System.out.print(arr[i] + " ");
		}
		System.out.println();
	}
	
	public static void main (String [] args) {
		Integer [] arr = {35, 25, 23, 1, 2, 3, 15, 14, 12, 13, 33, 43, 25, 3, 0, 100, 99, 88, 75};	
		System.out.println("排序前:");
		print(arr);
		sort(arr);
		System.out.println("排序后:");
		print(arr);
	}
}


希尔排序是插入排序的改进型,在插入算法中每次进行比较的都是紧挨着的元素即每次index都是按1增加的,现在把这个index每次增加的数量变为一定长度这就是希尔排序

希尔排序:

public class ShellSort{
	public static void sort (Comparable [] arr) {
		int result = 0;
		int shellFactor = arr.length / 3;
		while (shellFactor > 0) {
			for (int i=0; i<arr.length-shellFactor; i+=shellFactor) {
				for (int j=i+shellFactor; j>0; j-=shellFactor) {
					result = compare(arr[j], arr[j-shellFactor]);
					if (result < 0) {
						ex(arr, j, j-shellFactor);
					} else {
						break;
					}
				}
			}
			shellFactor--;
		}
	}
	
		//exchange 
	private static void ex(Comparable [] arr, int index1, int index2){
		if (index1 == index2 ) return;
		Comparable temp = arr[index1];
		arr[index1] = arr[index2];
		arr[index2] = temp;
	}
	
	//compare
	private static int compare(Comparable c1, Comparable c2){
		return c1.compareTo(c2);
	}
	
	private static void print(Comparable [] arr){
		System.out.print("array is : ");
		for (int i=0; i<arr.length; i++){
			System.out.print(arr[i] + " ");
		}
		System.out.println();
	}
	
	public static void main (String [] args) {
		Integer [] arr = {35, 25, 23, 1, 2, 3, 15, 14, 12, 13, 33, 43, 25, 3, 0, 100, 99, 88, 75};	
		System.out.println("排序前:");
		print(arr);
		sort(arr);
		System.out.println("排序后:");
		print(arr);
	}
}

猜你喜欢

转载自blog.csdn.net/qq_23013309/article/details/79728174