快速排序

快速排序是应用最广泛的排序算法,也是目前认为最好的一种内部排序方法(就平均时间而言)。它采用分治(divide-and-conquer)的策略,通过一趟排序将待排记录分割成独立的两个部分,使其中的一部分记录关键字均比另一部分记录关键字小(大),然后分别对两个部分继续进行排序,以达到整个序列有序。

快速排序的C/C++代码实现:

int partition(int sort_array[], int low, int high)
{
    int pivotkey = sort_array[low];
    while (low < high) {
        while (low < high && pivotkey <= sort_array[high]) --high;
        sort_array[low] = sort_array[high];
        while (low < high && pivotkey >= sort_array[low]) ++low;
        sort_array[high] = sort_array[low];
    }
    sort_array[low] = pivotkey;
    return low;
}

void quick_sort(int sort_array[], int low, int high)
{
    if (low < high) {
        int i = partition(sort_array, low, high);
        quick_sort(sort_array, low, i - 1);
        quick_sort(sort_array, i + 1, high);
    }
}

继续阅读

简单排序方法

简单的排序方法主要是指直接插入排序、冒泡排序和简单选择排序。他们都是稳定的排序方法,平均时间复杂度都为O(n2),并且空间复杂度都为O(1)。

直接插入排序

直接插入排序(Straight Insertion Sort)是一种最简单的排序方法,它的基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增1的有序表。直接插入排序的运行时间和数据原始排列顺序密切相关。对于已经排好序(或已几乎排好序)的数据,插入排序的效率会比较高。

直接插入排序的C/C++代码实现:

void insert_sort(int sort_array[], int length)
{
    int i, j;
    for (i = 2; i < length; ++i)
        if (sort_array[i] < sort_array[i-1]) {
            sort_array[0] = sort_array[i];
            sort_array[i] = sort_array[i-1];
            for (j = i - 2; sort_array[0] < sort_array[j]; --j)
                sort_array[j+1] = sort_array[j];
            sort_array[j+1] = sort_array[0];
        }
}

其中第6行在sort_array[0]处设置监视哨,避免在查找插入位置的过程中数组下标出界。

冒泡排序

冒泡排序(Bubble Sort)算法简洁,也很容易理解,因此经常被用来作为介绍排序算法的入门方法。但它对于除少数元素之外的数列排序很没有效率。在这三种简单排序算法当中也是最慢的一种(参考《算法I-IV(C++实现)》Robert Sedgewick著)。而且虽然它可以设置一个标志位以对某种情况下的排序效率进行改进(即判断文件是否已排好序,当其中一步已没有进行任何交换操作,即文件已排好序,就可以中断外部循环。这个改进可以提高冒泡排序对于已排好序的数据的运行效率),但是通常来说它的效率的提高还是比不上能中断内部循环的插入排序。
继续阅读