几种简单排序

冒泡排序


冒泡排序在排序算法中比较简单,但是可以帮助我们理解不变性。 不变性是指在算法中,某些条件在算法执行时是不变的,始终为真。



/**
 * 其不变性体现在out右边的数据项始终是有序的, 在整个过程中,该条件始终为真.
 * 最开始的时候out右边没有数据项.
 */
    public void bubbleSort() {
        int out, in;
        for (out = nElements - 1; out >= 1; out--) { //外循环, 从后向前
            for (in = 0; in < out; in++) { //内循环, 从前向后
                if (array[in] > array[in+1]) { //比较交换, 大的数据项不断后移.
                    long temp = array[in];
                    array[in] = array[in+1];
                    array[in+1] = temp;
                }
            }
        }
    }




选择排序


选择排序与冒泡排序一样,进行N*(N-1)/2次比较,即O(N的平方)。

/**
 * 其不变性体现在下标小于等于out数据项始终是有序的, 在整个过程中,该条件始终为真.
 */
    public void selectionSort() {
        int out, in, min;
        long temp;
        for (out = 0; out < nElements; out++) {
            min = out; //起始位置,最小值.
            for (in = out + 1; in < nElements; in++) { //注意in从out+1的位置开始
                if (array[min] > array[in]) { //如果还有更小的值
                    min = in; //设定新的最小值的下标
                }
            }
            temp = array[out]; //存放每轮循环最左边的值
            array[out] = array[min]; //最左边的值和新的最小值交换位置
            array[min] = temp;//最左边的值和新的最小值交换位置
        }
    }



插入排序


/**
 * 其不变性体现在下标小于out数据项是局部有序的,虽然有序,但是最终位置并未确定,因为会有位置变动的情况, 在整个过程中,该条件始终为真.
 */
public void insertionSort() {
        int out, in;
        for (out = 1; out < nElements; out++) { //out变量作为标记,从1开始.
            long temp = array[out]; //标记的数据项出列
            in = out;
            while (in > 0 && array[in-1] > temp) { //while循环每一次都向右移动了一个已排序的数据项.
                array[in] = array[in-1];//大的数据项右移
                --in; //in变量继续左移, 直到不满足条件而无法左移
            }
            array[in] = temp; //在in的位置插入标记的数据项
        }
    }

猜你喜欢

转载自summerhome.iteye.com/blog/2415343
今日推荐