简单排序

来源:互联网 发布:linux 安装anaconda2 编辑:程序博客网 时间:2024/04/29 11:09
/** * 冒泡排序 *  * @author yiyaqin * @date 2011-11-17 上午09:29:30 */public static void bubbleSort() {int a[] = { 1, 5, 2, 6, 3 };for (int j = a.length - 1; j > 0; j--) {for (int i = 0; i < j; i++) {// 从a[i]开始 依次比较a[i]和a[i+1]if (a[i] > a[i + 1]) {// 比较之后 a[i]和a[i+1]进行交换int swap = a[i];a[i] = a[i + 1];a[i + 1] = swap;}}}}/** * 选择排序 *  * @author yiyaqin * @date 2011-11-17 上午09:46:20 */public static void selectSort() {int a[] = { 1, 5, 2, 6, 3 };int min;for (int j = 0, n = a.length; j < n - 1; j++) {// 从a[0]开始进行比较min = j;for (int i = j + 1; i < n; i++) {if (a[i] < a[min]) {min = i;}}// 如果有比a[min]更小的就进行交换int swap = a[j];a[j] = a[min];a[min] = swap;}}/** * 插入排序 * @author yiyaqin * @date 2011-11-17 上午10:15:33 */public static void insertionSort() {int a[] = { 1, 5, 2, 6, 3 };for (int out = 1, n = a.length; out < n; out++) {//从a[1]位置开始比较 int temp = a[out];//in 为最小值索引int in = out;//循环交换最小值位置while (in > 0 && a[in - 1] > temp) {a[in] = a[in - 1];--in;}a[in] = temp;}}

各排序的效率 
冒泡排序
        1. 比较:一般来说,数组中有N项,第一趟需要比较N-1次,第二趟比较N-2次,以此类推,最后一趟比较1次,那么总的比较次数就是(N-1)+(N-2)+...+2+1=N*(N-1)/2。那么,算法大概进行了N*N/2次比较(忽略减一,不会有很大的差别,尤其是当N非常大时)
        2. 交换:两个数据只有在必要时才会进行交换,如果数据是随机的话,大概有一半的比较需要交换,那么就是N*N/4

由于比较和交换次数都和N*N成正比,而常数不在大O表示方法里,可以忽略2和4,我们认为冒泡排序运行需要O(N*N)时间级别。


选择排序
         1. 比较:选择排序和冒泡排序一样,都经过了N*(N-1)/2次比较。那么我们可以将其认为进行了大概N*N/2次比较。
         2. 交换:由于内部的循环只是找出最小值,外部的循环才有可能需要交换,所以交换次数最多是N-1

当N值很大时,比较的次数是主要的。所以结论是选择排序和冒泡排序一样,都要运行O(N*N)时间级别。但是选择排序无疑是比冒泡排序更快的,因为它需要交换的次数少了很多。当N值较小时,或者是当交换的时间比比较所需的时间大很多时,选择排序实际上是相当快的。


插入排序
          1. 比较:在第一趟时最多比较1次,第二趟最多比较2次。以此类推,最后一趟最多比较N-1次。总的比较次数就是1+2+...+(N-1)=N(N-1)/2。然而,每一趟发现新的排序点之前,平均只有一半数据真的进行了比较,所以比较次数大概为N*N/4。
         2. 复制:复制的次数大约等于比较次数。然而一次复制与一次交换所需的时间不同(一次交换要复制三次)。所以插入排序所需要的时间大概是冒泡排序的一半,而比选择排序快一点。
在任意情况下,对随机顺序的数据进行插入排序也需要O(N*N)的时间级。


原创粉丝点击