首页 > 代码库 > 排序算法
排序算法
选择排序
定义:依次选择最小的元素放在相应的位置上
特点:比较次数是 N(N-1)/2 交换次数是 N (each exchange puts an item into its ?nal position, so the number of exchanges is N. Thus, the running time is dominated by the number of compares);每一次寻找最小元素的过程不会为下一趟的寻找提供额外信息,所以对于一个有序的数组,仍然要花和一个随机数组一样长的时间;选择排序中数组访问是和数组尺寸线性相关的,这是其他排序不具有的。
实现:
public class SelectionSort {
// This class should not be instantiated.
private SelectionSort() {
}
// ascending order
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);
assert isSorted(a, 0, i);
}
assert isSorted(a);
}
/***********************************************************************
* Helper sorting functions
***********************************************************************/
// is v < w ?
private static boolean less(Comparable v, Comparable w) {
return (v.compareTo(w) < 0);
}
// exchange a[i] and a[j]
private static void exch(Object[] a, int i, int j) {
Object swap = a[i];
a[i] = a[j];
a[j] = swap;
}
/***********************************************************************
* Check if array is sorted - useful for debugging
***********************************************************************/
// is the array a[] sorted?
private static boolean isSorted(Comparable [] a) {
return isSorted(a, 0, a. length - 1);
}
// is the array sorted from a[lo] to a[ hi]
private static boolean isSorted(Comparable [] a, int lo, int hi) {
for (int i = lo + 1; i <= hi; i++)
if (less(a[i], a[i - 1]))
return false ;
return true ;
}
// print array to standard output
private static void show(Comparable[] a) {
for (int i = 0; i < a. length; i++) {
System. out .print(a[i] + " " );
}
}
public static void main(String[] args) {
Integer[] a = { 10, 45, 0, 8, 7, -34, 20 };
SelectionSort. sort(a);
show(a);
}
}
插入排序
定义:可以联系到扑克牌,每次都是将一个数字插入到一个有序序列的合适位置,为了给其腾出空间,需要后移比他大的元素。
特点:虽然在当前元素(current index)左边都是有序的,但是却不是他们的最终位置;对于一个随机数组,假设每次在插入一个元素时都是移动一半,则#compare=N^2/4,#exchange=N^2/4;最坏情况是每次都是插入到第一个位置(和选择排序一样了)是N^2/2,最好情况是已经有序,只需要比较N-1次。
实现:
public class InsertionSort {
//其他代码同上
// ascending order
public static void sort(Comparable[] a) {
int N = a.length ;
for (int i = 0; i < N; i++) {
for (int j = i; j > 0 && less (a[j], a[j - 1]); j--) {
exch(a, j, j - 1);
}
}
}
}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。