图中为快速排序的一个基本实现过程
#include"stdio.h"
#define MAX 10
int Array[MAX] = { 49,38,65,97,76,13,27,90 }; //定义一个需要排序的数组
void Quick_Sort(int* arr, int low, int high)
{
if (low < high)
{
int i = low;
int j = high;
int key = arr[low]; //选定排序的参考元素
while (i < j) //对高位和低位进行大小比较
{
while (i < j && arr[j] >= key) //key后的元素大于key时不对元素处理,继续往低位移
{
j--;
}
//key后的元素小于key时
if (i < j)
{
arr[i++] = arr[j]; //将元素存到key前
}
while (i < j && arr[i] < key) //key前的元素小于key时不对元素处理,继续往高位移
{
i++;
}
//key前的元素大于key时
if (i < j)
{
arr[j--] = arr[i]; //将元素存到key后
}
}
arr[i] = key;
Quick_Sort(arr, low, i - 1); //对key前的数据进行递归排序
Quick_Sort(arr, i + 1, high); //对key后的数据进行递归排序
}
}
void Print(int* p) //输出数组
{
for (p = Array; *p != NULL; p++)
printf("%d ", *p);
}
void main()
{
printf("排序前的数组:");
Print(Array);
Quick_Sort(Array, 0, 7);
printf("n排序后的数组:");
Print(Array);
}
大概对以上程序做一个大概的讲解:
以(int *arr,int low, int high)作为形参的Quick_Sort函数,参数中*arr表示指针指向数组的首地址,low表示最低位,high最高位。在进入函数体后,首先对low和high的值做判断,低位的值小于高位则往后进行,然后用变量 i 保存数组的最低位,用 j 保存数组最高位,key保存数组的第一位数据,即选定排序的参考对象,通过while( i < j )来判断是否可以进入循环,进入循环后,当数组中由高位到低位依次进行数组中元素的选取,并与前面所选取的参考对象进行比较,若选取的元素比参考对象大,则不对元素处理,若比参考对象小,则把元素保存到参考对象前面,直到j移到参考对象的位置上则不再进行保存。然后依次从低位往高位选取元素来与参考对象做比较,若选取的元素比参考对象小,则不对元素做处理,若比参考对象大,则把元素存储到参考对象之后,这样就实现了第一次快速排序,参考对象左侧和右侧的元素也是依照上述规则来排序的,只是排序的个数不一样,排序的深度有所不同,但原理都是一样的,因此依照上述方法进行函数的递归调用,对参考对象左右的元素再次进行快速排序,从而得到排序正确的数组。



