void quickSort(int k[ ],int left,int right)
{ //left代表需要排序的那段数字的起始位置,right则代表终止位置
int i, last; //last始终代表已经排序好的数字段的最后一个,一次排序结束,last是分界数字,
if(left<right)
{ //如果left>=right排序完成终止
last=left;
for(i=left+1;i<=right;i++)
{ //将起始位置当作分界数,从下一个数字开始搜索
if(k[i]<k[left]) //降序排序则是'>'
swap(&k[++last],&k[i]); //一个交换函数
}
swap(&k[left],&k[last]); //将分界数换至分界位置上
quickSort(k,left,last-1); //递归,将分开的两段继续排序
quickSort(k,last+1,right);
}
}
void swap(int *i,int *j)
{
int t;
t=*i;
*i=*j;
*j=t;
}
解读:快速排序是将第一个数作为分界数,将小于它的数全部放到一边而不管顺序,大于它的数则放到另一边,
递归下去,则最终实现排序。
递归下去,则最终实现排序。
相关知识:选择排序的时间复杂度为O(n^2),适用于n较小的情况
快速排序是选择排序的改进,时间复杂度为O(nlogn),最坏情况退化为选择排序时间复杂度为O(n^2)
适用于n较大的情况
快速排序是选择排序的改进,时间复杂度为O(nlogn),最坏情况退化为选择排序时间复杂度为O(n^2)
适用于n较大的情况
改进:调整分区,以下代码将数组分为两区,可以改进分为更多区
相关:三路基数快排、随机化快排、平衡快排、外部快排、三平均分区法
相关:三路基数快排、随机化快排、平衡快排、外部快排、三平均分区法