快速排序(Quick Sort)概念:是由冒泡排序改进而得到的。在冒泡排序过程中,只对相邻的两个记录进行比较,因此每次交换两个相邻记录时只能消除一个逆序。如果能通过两个(不相邻)记录的一次交换,消除多个逆序,则会大大加快排序的速度。快速排序方法中的一次交换可以消除多个逆序。
快速排序的算法步骤:在待排序的n个记录中任取一个记录(通常取第一个记录)作为枢轴(或支点),设其关键字为pivotkey。经过一趟排序后,把所有关键字小于pivotkey的记录交换到前面,把所有关键字大于pivotkey的记录交换到后面,结果将待排序记录分成两个子表,最后将枢轴放置在分界处的位置。然后,分别对左右子表重复上述过程,直至每个子表只有一个记录时排序完成。
例如对如下记录进行快速排序 :49,38,65,97,76,13,27,49*
下面将会对上述记录进行快速排序,排序的过程如下所示:
初始化:49(low/pivotkey),38,65,97,76,13,27,49*(high)
第一趟排序以第一个数49作为枢轴进行快速排序
排序的过程是交替振荡逼近的:就是pivotkey先和数组中最后一个数进行比较,不交换的话就和倒数第二个数进行比较直到交换,如果交换了,pivotkey就和数组第一个数进行比较,如果不交换的话pivotkey就和就和第二个数进行比较,直到交换,交换后pivotkey就要和之前后面所交换的前一个数进行比较,依次下去,这就是交替振荡逼近法。
第一趟快速排序:{27,38,13},49,{76,97,65,49*}
第二趟快速排序:{13},27,{38},49,{76,97,65,49*}
第三趟快速排序:13,27,38,49,{49,65},76,{97}
第四趟快速排序:13,27,38,49,49*,{65},76,97
第四趟快速排序:13,27,38,49,49*,65,76,97
下面我将用代码实现上述的过程:
#include<stdio.h>
#include<windows.h>
void swap(int array[], int low, int high)//用于交换数组中两个数值
{
int temp;//中间变量用于交换两个数值
temp = array[low];
array[low] = array[high];
array[high] = temp;
}
int partition(int array[], int low, int high)
{
int pivotkey = array[low];//设置数组第一个元素为比较元素
while (low < high)
{
while ((low<high) && (array[high] >= pivotkey))
{/*数组最后一个元素比pivotkey大,那么array[high]就应该放
在pivotkey的后面,所以high需要向前移动*/
high--;
}
//否则就交换array[low]和array[high]的数值
swap(array, low, high);
while ((low<high) && (array[low] <= pivotkey))
{
low++;
}
//否则就交换array[low]和array[high]的数值
swap(array, low, high);
}
return low;//最后返回枢轴的位置。
}
void Qsort(int array[], int low, int high)
{
if (low<high)//如果符合判断条件的话就递归
{
int key = partition(array, low, high);//用key去接收第一躺排序之后枢轴的位置】、
Qsort(array, low, key - 1);//左边子序列
Qsort(array, key + 1, high);//右边子序列
}
}
void Quicksort(int array[], int len)//快排开始
{
Qsort(array, 0, len - 1);//调用递归函数
}
void Print(int array[], int len)//用于打印整个数组
{
for ( int i = 0;i<len; i++)
{
printf("%3d",array[i]);
}
}
void main()
{
int array[] = { 13, 27, 38, 49, 49, 65, 76, 97};
Quicksort(array,8);//调用快速排序的函数对上面的数组进行快速排序
printf("快速排序的结果为:\n");
Print(array, 8);
printf("\n");
system("pause");//暂停一下
}
代码运行截图如下所示:
