基本概念

  • 分治 思想
  • 选定一个数(一般是中间),以这个数为基准,将小于它的数放在它左边,大于的数在右边,(如果要从小到大)等于的数在左边或右边都行。
  • 再以这个数为界排序左右分段,最终实现排序
  • 最好是 最差是
  • 具体实现

    • 找分界点,直接相加除2
    • 递归处理各段
  • 代码实现

void quick_sort(int a[], int l, int r)
{
 if(l >= r)
     return;
 
 int x = q[l + r >> 1], i = l - 1, j = r + 1;//因为用do,while
   								  //要注意的是,此处的x取值与下面的递归有关系,若x取l,
   								  //下面递归不能用i-1和i,会出现无限循环,在输入为1,2时
 
 while(i < j)
 {
     do i ++;
     while(q[i] < x);//左边找大于x
 
     do  j --;
     while(q[j] > x);//右边找小于x
 
     if(i < j)
   	  swap(q[i], q[j]);
 }
 
 quick_sort(q, l, j);//第一次调整好后,分开再调整
 quick_sort(q, j + 1, r);
}
  • 另有快速选择

  • 排序一样,只是要找到排序后的第k个数
  • 使用返回 递归函数 来实现
  • 外加 if 语句来选择每要查找的数在哪一边,只递归那一边就可以

三路排序

void quick_sort(int a[], const int len)
{
	if(len <= 1) return;
	const int pivot = a[rand() % len];
 
	//i,当前操作数
	//a[0, j) 存储小于pivot的元素
	//a[k, len) 存储大于pivo的元素
	
	int i = 0, j = 0, k = len;
	while(i < k)
	{
		if(a[i] < pivot)
			swap(a[i ++], a[j ++]);
		else if(pivot < a[i])
			swap(a[i], a[-- k]);
		else
			i ++;
	}
	quick_sort(a, j);
	quick_sort(a + k, len - k);
}

内省排序

sort实现就是内省排序 当时间复杂度超过限制后转换为堆排序,保证