在待排序数据中先找一个标杆位置p,备份p位置的值val,记录左标杆l、右标杆r,l从p的左边找比val大的数,找到后赋值给p位置,更新p到l,然后r从p的右边找比val小的数,找到后赋值给p位置,更新p到r
循环往复,直到l和r重合,把val还原回p位置完成一次快排,然后用同样的方式对p左右两边的数据进行快排
它的综合性能最优,因此得名快速排序
void quick_sort(TYPE* arr,size_t len)
{
printf("%s:\n",__func__);
show(arr,LEN);
_quick(arr,0,len-1);
}
// 合并 l左部分最左 p左部分最右 p+1右部分最左 r右部分最右
void __merge(TYPE* arr,TYPE* temp,int l,int p,int r)
{
// 合并前 左右部分各自有序
if(arr[p] <= arr[p+1]) return;
int s = l;
int i = l, j = p+1;
while(i<=p && j<=r)
{
// 左右部分从开头进行比较
if(arr[i] <= arr[j]) // <= 确保是稳定的
temp[s++] = arr[i++];
else
temp[s++] = arr[j++];
}
// 比完后,把多的部分剩余的数据依次存入temp
while(i<=p) temp[s++] = arr[i++];
while(j<=r) temp[s++] = arr[j++];
// 把temp还原回对应位置的arr
memcpy(arr+l,temp+l,sizeof(TYPE)*(r-l+1));
}
时间复杂度:O(NlogN)
不稳定