快速排序:
#define SWAP(a, b) {int temp; temp = a; a = b; b = temp;}
typedef int PARAMER_TYPE;
void quick_sort_sub(PARAMER_TYPE *data, int left, int right)
{
int left_index = left;
int right_index = right;
int pivot = data[(left + right) / 2];
while (left_index <= right_index)
{
for ( ; data[left_index] < pivot; left_index++); //若想改为降序-->data[left_index] > pivot
for ( ; data[right_index] > pivot; right_index--);//若想改为降序--> data[right_index] < pivot
if (left_index <= right_index)
{
SWAP(data[left_index], data[right_index]);
left_index++;
right_index--;
}
}
if (right_index > left)
{
quick_sort_sub(data, left, right_index);
}
if (left_index < right)
{
quick_sort_sub(data, left_index, right);
}
}
void quick_sort(PARAMER_TYPE *data, int data_size)
{
quick_sort_sub(data, 0, data_size - 1);
}
这个例程是对 int 的数组进行排序。向函数 quick_sort()传递 int 型数组 data 和数组的长度, 数组中的元素会被升序排序。quick_sort_sub()将数组 data 的元素从 data[left]到data[right] 的部分进行排序(包括 data[left]和data[right]) 。quick_sort_sub()首先决定 pivot 的值, 然后把数组的元素分成大于
pivot 和小于 pivot 两个类别*。
因为程序优先对数组的左侧进行处理, 所以数组将会被排序成下图中的样子。
首先, 原始的数组被分类成大于 pivot 和小于 pivot 两个部分。 对分类后的左侧(部分数组 1) 递归调用自身再次进行分类(1) 。 然后对分类的结果的左侧再分类, 再分类……就这样不断地递归下去, 一直进行到左侧还剩下一个元素(4) , 再去处理右侧。 就这样顺次地连续返回, 对残留的部分进行处理(5) 。
那么在这里, 处理完数组某部分的左侧之后, 之所以处理还能够转移到右侧, 是因为 C 将自动变量 分配在栈中。
这个程序将数组分成两部分之后, 再进行递归调用。 此时, 在栈中分配了新的用于当前部分数组的 内存区域。 另外, 当某部分数组的数据处理完毕, 函数调用返回的时候, 栈会收缩, 调用前的状态恰好处于栈的最初位置。 正因为如此, 处理才这样不断地向右移动。