算法(2.1 初级排序)

来源:互联网 发布:淘宝打假部门联系方式 编辑:程序博客网 时间:2024/06/06 06:35

重新读算法这本书,把代码写一下,做好博客


排序算法类模板

public class Example {      public static void sort(Comparable[] a){                }            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<a.length; i++){              System.out.print(a[i] + " ");          }          System.out.println();      }            public static boolean isSorted(Comparable[] a){          for (int i=1; i<a.length; i++){              if (less(a[i], a[i-1])){                  return false;              }          }          return true;      }            public static void main(String[] args) {          int N = 10;          Integer[] a = new Integer[N];          for (int i=0; i<N; i++){              a[i] = (int)(Math.random()*100);          }          sort(a);          assert isSorted(a);          show(a);                    }  }  


2.1.2 选择排序

// 2.1.2 选择排序//一种最简单的排序算法是这样的:首先,找到数组中最小的那个元素,//其次将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和它自己交换)。//再次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序。//这种方法叫做选择排序,因为它在不断选择剩余元素之中的最小者。////结论:不管数组初始状态怎样所需时间都是一样的////2017年8月3日20:46:24public class Selection{public static void sort(Comparable[] a){//按数组升序排列int N = a.length;for (int i=0; i<N; i++){int min = i;//最小数组的索引for (int j=i+1; j<N; j++){if (less(a[j], a[min])){min = j;}}exch(a, i, min);}}// less() exch() isSorted()和main()    方法见“排序算法类模板”}

2.1.3 插入排序

// 2.1.3 插入排序//通常人们整理桥牌的方法是一张一张的来,将每一张牌插入到其他已经有序的牌中的适当位置。//在计算机的实现中,为了给要插入的元素腾出空间,我们需要将其余所有元素在插入之前都向右移动以为。//这种算法叫做插入排序////下面是几种典型的部分有序的数组://1.数组中的每个元素距离它的最终位置都不远//2.一个有序的大数组接一个小数组//3.时更要注意中只有几个元素的位置不正确//插入排序对这样的数组很有效,而选择排序不然。//事实上,当倒置的数量很少时,插入排序很可能比本章中的其他任何算法要快。////2017年8月3日21:21:48public class Insertion{public static void sort(Comparable[] a){//按数组升序排列int N = a.length;for (int i=1; i<N; i++){//将a[i]插入到a[i-1]、a[i-2]、a[i-3]...之中for (int j=i; j>0 && less(a[j], a[j-1]); j--){exch(a, j, j-1);}}}// less() exch() isSorted()和main()    方法见“排序算法类模板”}



2.1.6 希尔排序

// 2.1.6 插入排序//希尔排序的思想是使数组中任意间隔为h的元素都是有序的。//这样的数组被称为h有序数组。换句话说,一个h有序数组就是h个互相独立的有序数组编织在一起组成的一个数组。//在进行排序时,如果h很大,我们就能将元素移动到很远的地方,为实现更小的h有序创造方便。//用这种方式,对于任意以1结尾的h序列,我们都能够将数组排序。这就是希尔排序////算法2.3的实现使用了1/2(3的k次方-1),从N/3开始递减至1.我们把这个序列称为递增序列////2017年8月3日22:50:47public class Shell{public static void sort(Comparable[] a){//按数组升序排列int N = a.length;int h = 1;while (h < N/3){h = 3*h + 1;}while (h >= 1){//将数组变为h有序for (int i=h; i<N; i++){//将a[i]插入到a[i-h]、a[i-h]、a[i-h]...之中for (int j=i; j>=h && less(a[j], a[j-h]); j-=h){exch(a, j, j-h);}}h /= 3;}}// less() exch() isSorted()和main()    方法见“排序算法类模板”}

原创粉丝点击