Archive for the ‘Algorithm’ Category

堆排序

堆排序是对树形选择排序的改进,它首先将整个待排序列构建成一个堆,然后将堆顶元素与最后一个元素交换,由此得到一个有序元素和一个长度减1的堆。由于交换后新的堆顶元素可能不满足堆的定义,因此需要将新的堆重新进行堆化(堆化无需重新建堆,只需做少许调整),在堆化完成之后再次将堆顶元素与堆的最后一个元素交换,由此再得到一个新的有序元素和一个长度减1的堆。然后再重新进行堆化,再交换。。。这样一直下去,直到整个堆只有一个元素为止。这样也就完成了对序列的排序。由这个排序的过程也可以知道,堆排序和简单选择排序不同,不是从前往后慢慢有序,而是从后往前慢慢有序。 堆排序的C/C++代码实现: void heapify(int sort_array[], int k, int m) {     int temp = sort_array[k];     for (int j = 2 * k; j < = m; j *= 2) {         if (j < m && sort_array[j] < sort_array[j+1]) ++j;         if (!(temp < sort_array[j])) break;         [...]

Read the rest of this entry »

快速排序

快速排序是应用最广泛的排序算法,也是目前认为最好的一种内部排序方法(就平均时间而言)。它采用分治(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;       [...]

Read the rest of this entry »

希尔排序

希尔排序是插入排序的扩展。希尔排序的一个特点是:子序列的构成不是简单的逐段分割,而是将相隔某个增量的记录组成一个子序列。希尔排序的一个关键是:其步长(也就是增量)的取法,通常认为步长序列中的数字互质很重要。 希尔排序的C/C++代码实现: void shell_insert(int sort_array[], int length, int h) {     int i, j, temp;     for (i = h; i < length; ++i)         if (sort_array[i] < sort_array[i-h]) {             temp = sort_array[i];             sort_array[i] = sort_array[i-h];           [...]

Read the rest of this entry »

简单排序方法

简单的排序方法主要是指直接插入排序、冒泡排序和简单选择排序。他们都是稳定的排序方法,平均时间复杂度都为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];         [...]

Read the rest of this entry »

折半查找

折半查找(二分查找)是一种简单而又高效的查找算法,其查找长度至多为㏒2n+1(判定树的深度),平均查找长度为㏒2(n+1)-1,效率比顺序查找要高,但折半查找只能适用于顺序存储有序表(如对线性链表就无法有效地进行折半查找)。 折半查找的C/C++代码实现: int binary_search(int search_table[], int length, int key) {     int low = 0;     int high = length – 1;     while (low < = high) {         int mid = (low + high) / 2;         if (key == search_table[mid])             return mid;   [...]

Read the rest of this entry »