介绍
快速排序(Quick Sort)是一种高效的排序算法,其基本思想是通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
快速排序算法的实现原理:
- 选择一个基准元素,通常选择第一个元素或者最后一个元素。
- 将比基准元素小的元素放到基准元素的左边,将比基准元素大的元素放到基准元素的右边,这个过程称为划分。
- 对基准元素左边的元素和右边的元素分别进行递归排序。
代码实现
#define PTR_MATH(base,i,width) ( ((char*)base) + (i)*width )
这是一个C语言的宏定义,用于实现指针的数学运算。它的目的是简化指针的偏移量计算,提高代码的可读性和可维护性。这个宏定义的实现原理是,通过将指针与一个整数相加,实现指针的偏移量计算。其中,base 是原始指针,i 是偏移量,width 是指针宽度。
//快速排序
void quickSortRecursive(void* base, int left, int right ,int width, int(*compare)(const void* e1, const void* e2),void* temp){
if(left>=right)
return;
int left_index=left;
int right_index=right;
//左边第一个元素作为中间元素
memcpy(temp,PTR_MATH(base,left,width),width);
char isleft=0;
while(left_index!=right_index){
if(isleft==0){
//再右边找到大于中间元素的值,替换左边空位
if(compare(PTR_MATH(base,right_index,width),temp)<0){
memcpy(PTR_MATH(base,left_index,width),PTR_MATH(base,right_index,width),width);
left_index++;
isleft=1;
}else{
right_index--;
}
}
else{
//再左边找到小于中间元素的值,替换右边空位
if(compare(PTR_MATH(base,left_index,width),temp)>=0){
memcpy(PTR_MATH(base,right_index,width),PTR_MATH(base,left_index,width),width);
right_index--;
isleft=0;
}else{
left_index++;
}
}
}
//将中间元素放入空位
memcpy(PTR_MATH(base,left_index,width),temp,width);
quickSortRecursive(base,left,left_index,width,compare,temp);
quickSortRecursive(base,right_index+1,right,width,compare,temp);
}
void quickSort(void* base, int len,int width, int(*compare)(const void* e1, const void* e2)){
if(base==NULL||compare == NULL||width<=0||len<=1)
return;
void * temp = malloc(width);
if(temp == NULL)
return;
quickSortRecursive(base,0,len-1,width,compare,temp);
free(temp);
}
图解
总结
快速排序是一种不稳定排序算法,在某些情况下,可能会产生最坏情况,即时间复杂度为O(n^2)。为了避免这种情况,可以采用随机化的方式选择基准元素,或者使用其他更高效的排序算法。