快速排序又是一种分而治之思想在排序算法上的典型应用。本质上来看,快速排序应该算是在冒泡排序基础上的递归分治法。即在一个无序的序列中选取一个任意的基准元素pivot,利用pivot将待排序的序列分成两部分,前面部分元素均小于或等于基准元素,后面部分均大于或等于基准元素,然后采用递归的方法分别对前后两部分重复上述操作,直到将无序序列排列成有序序列。 排序 n 个项目要 Ο(nlogn) 次比较。在最坏状况下复杂度为Ο(n2)。
1、快速排序算法定义
#include <stdlib.h>
#include <stdio.h>
typedef unsigned int DataField;
/**
* 快速排序
* @param data 待排序数组
* @param left 低位下标
* @param right 高位下标
*/
void quick_sort(DataField* data,int left,int right);
void show_data(DataField* data,int len);
void quick_sort(DataField* data,int left,int right)
{
int low = left , high = right;
/// 递归退出条件
if( left > right)
return;
///确定pivot
DataField pivot = *(data + low);
while (low < high)
{
/// 先从右边向左查找,找到小于pivot的元素及其下下标
while ( low<high && *(data+high)>=pivot)
{
high--;
}
/// 再从左向右查找,找到大于pivot的元素及其下标
while ( low<high && *(data+low)<=pivot )
{
low++;
}
/// 元素交换
if(low<high){
DataField temp = data[low];
data[low] = data[high];
data[high] = temp;
}
}
/// 将pivot的值与当前高位交换
// data[left] = data[high] ;
// data[high] = pivot;
// quick_sort(data,left,high-1);
// quick_sort(data,high+1,right);
data[left] = data[low];
data[low] = pivot;
quick_sort(data,left,low-1);
quick_sort(data,low+1,right);
}
void show_data(DataField *data, int len)
{
printf("-----------------\n");
int i = 0;
for (i; i < len; i++)
{
printf("%d\t",*(data+i));
}
printf("\n");
}
2、测试快速排序
DataField arr[] ={ 19,29,49,69,99,59,39,9,79,89 };
DataField* data = &arr[0];
int len = sizeof(arr)/sizeof(DataField);
quick_sort(data,0,len);