《算法》逆序数组,选择排序和插入排序谁更快

2.1.6  在所有的主键都相同时,选择排序和插入排序谁更快?

插入排序更快

2.1.7  对于逆序数组,选择排序和插入排序谁更快?

选择排序更快

为什么?看完代码后,再解释


一、插入排序的代码

package test;

import edu.princeton.cs.algs4.In;
import edu.princeton.cs.algs4.StdOut;

public class Insertion {
	public static void sort(Comparable[] a){
		for(int i=1; i0 && less(a[j], a[j-1]); j--){
				exch(a, j, j-1);
			}
		}
	}
	
	private static boolean less(Comparable v, Comparable w){
		return v.compareTo(w) < 0;
	}
	
	private static void exch(Comparable[] a, int i, int j){
		Comparable t = a[i];
		a[i] = a[j];
		a[j] = t;
	}
	
	private static void show(Comparable[] a){
		for(int i=0; i


二、选择排序的代码

package test;

import edu.princeton.cs.algs4.In;
import edu.princeton.cs.algs4.StdOut;

public class Selection {
	public static void sort(Comparable[] a){
		int N = a.length;
		for(int i=0; i


三、算法时间比较的代码

package test;

import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;
import edu.princeton.cs.algs4.StdRandom;
import edu.princeton.cs.algs4.Stopwatch;

public class SortCompare {
	public static double time(String alg, Double[] a){
		Stopwatch timer = new Stopwatch();
		if(alg.equals("Insertion")) Insertion.sort(a);
		if(alg.equals("Selection")) Selection.sort(a);
		/*if(alg.equals("Shell")) Shell.sort(a);
		if(alg.equals("Merge")) Merge.sort(a);
		if(alg.equals("Quick")) Quick.sort(a);
		if(alg.equals("Heap")) Heap.sort(a);*/
		return timer.elapsedTime();
	}
	
	public static double timeRandomInput(String alg, int N, int T){
		//使用算法alg,将T个长度为N的随机数组排序,所花的时间
		double total = 0.0;
		Double[] a = new Double[N];
		for(int t = 0; t < T; t++){
			//进行一次测试(生成一个数组并排序)
			for(int i=0; i

四、运行 算法时间比较的代码SortCompare.java进行比较

控制台输入: Insertion Selection 1000 100

输出结果(每个人电脑,每次结果都不同,不要慌):

Insertion Selection 1000 100
for 1000 random Doules
  Insertion is 1.3 times faster than Selection
for 1000 equal Doules
  Insertion is 213.0 times faster than Selection
for 1000 inverse Doules
  Insertion is 0.9 times faster than Selection


五、解释

1、为什么所有的主键都相同时,插入排序更快?

数组元素都相同时

插入排序,比较次数N-1,交换次数0

选择排序,比较次数N(N-1)/2,交换次数0


2、为什么对于逆序数组,选择排序更快?

数组逆序时

插入排序,由于逆序对有N(N-1)/2对,所以交换次数是N(N-1)/2。比较次数大于等于交换次数,小于等于

交换次数+N-1。

选择排序,不管输入是怎样的,比较次数都是N(N-1)/2。此时交换次数为N-1。


你可能感兴趣的:(《算法》零碎答案,选择排序,插入排序,算法)