插入排序

来源:互联网 发布:多益网络实力 编辑:程序博客网 时间:2024/06/15 02:28

先用一个简单的例子来说明一下插入排序的方法。
假设要对数组|5|1|4|6|进行排序,插入排序的方法为,从第二个元素,即1开始到结尾,每一轮把当前考察的元素放置在它正确的位置上。这么说还是有点抽象,结合例子来理解。
第一轮:
这一轮所要做的事情是把第二个元素即1,放置在合适的位置上。
原:|5|1|4|6|
1)|1|5|4|6|
因为1比5小,所以和5交换了位置,此时前2个元素已经有序。
第二轮:
把第三个元素,即4放置在合适的位置上。
原:|1|5|4|6|
1)|1|4|5|6|
因为4比5小,所以和4交换位置。
2)|1|4|5|6|
由于4比1大,所以不需要交换,这一轮结束。此时前三个元素已经有序。
第三轮:
把第四个元素,即6放置在合适的位置上。
原:|1|4|5|6|
1)|1|4|5|6|
因为6比5大,所以不需要交换位置,又因为前面三个元素已经有序,所以现在整个数组已经有序,排序到此完成。
下面是C++的代码实现:

template<typename T>void SelectionSort1( T arr[], int n ){    //从第二个元素开始,将每一个元素放置在它前面已有序数组的合适位置上    for( int i = 1; i < n; i ++ )        //最后一组的比较是arr[1]和arr[0]所以循环结束条件是 j > 0        for( int j = i; j > 0; j -- ){            if( arr[j] < arr[j-1] )                swap( arr[j], arr[j-1] );            else//如果考察的元素已经放置在合适的位置上,则退出此次循环                break;        }}

这个插入排序算法,还有可以优化的地方,在上述的代码实现中,我们频繁地使用了交换操作,我们知道,一次交换实际上相当于三次赋值操作,所以如果能够对交换操作进行优化,我们就能够优化这个插入排序。噢,实际上,我们其实并不需要进行那么多次交换操作,也能达到目的。我们先把当前考察的元素复制一份出来,然后把之前的交换操作换成赋值操作,这样就将先前的交换(相当于三次赋值)替换为赋值操作。详细代码如下:

template<typename T>void insertionSort(T arr[], int n){    for( int i = 1 ; i < n ; i ++ ) {        // 寻找元素arr[i]合适的插入位置        T e = arr[i];        int j; // j保存元素e应该插入的位置        for (j = i; j > 0 && arr[j-1] > e; j--)            arr[j] = arr[j-1];        arr[j] = e;    }    return;}
原创粉丝点击