快速排序
快速排序是在待排序序列中选定一个数(一般以选择第一个数),然后将待排序序列这样处理:以选定的这个数为基准,这个数的左边存放比它小的数,右边存放比它大的数。处理完之后去右边的区间选定一个数继续进行这样的过程,去右边的区间选定一个数继续进行这样的过程。
例如序列{50, 10, 90, 30, 70, 40, 80, 60, 20}。第一趟时,选择50为基准,做一个循环将比50小的数移动到左边,比50大的数移动到右边。该序列变为{20, 10, 40, 50, 70, 80, 60, 90}。然后在50的左边的区间和右边的区间继续进行这样的操作,得到序列{10, 20, 40, 50, 60, 70, 80, 90},接着去然后20的左边和右边,70的左边和右边进行这样的操作。
有上面的介绍可以看出,快速排序最主要的过程就是要将比基准元素小的数移动到基准元素的左边,将比基准元素大的数移动到基准元素的右边。这个过程的实现是通过两个标志指针(不是实际意义上的指针,有些像控制循环变量i),一个指针i从下标0开始向后,一个指针j从size-1开始向前,j先开始移动去找比基准元素小的值,找到的话将这个值赋值给i指向的空间,接着i开始移动,去找比基准元素大的数,找到的话将其赋值给j指向的空间,然后j移动…..一直到i和j相遇为止。
typedef int datatype;
int QuickSort(datatype *array, int low, int high)
{
int i = low;
int j = high;
int temp;
if(array == NULL) {
return -1;
}
//递归的临界条件
if(low >= high) {
return -1;
}
//选取区间第一个数为基准元素
temp = array[low];
while(i != j) {
//j向前移动找比基准元素小的数
for( ; j > i && array[j] > temp; j--)
;
//将找到的数赋值给i指向的空间
if(j > i) {
array[i] = array[j];
i++;
}
//i向后移动找比基准元素大的数
for( ; i < j && temp > array[i]; i++)
;
//将找到的数赋值给j指向的空间
if(i < j) {
array[j] = array[i];
j--;
}
}
//将基准元素放在中间的位置(即i或j指向的位置)
array[i] = temp;
//比基准元素小的左区间进行快速排序
QuickSort(array, low, i-1);
//比基准元素大的右区间进行快速排序
QuickSort(array, i+1, high);
return 0;
}