快速排序-排序算法

算法思想

快速排序采用的仍然是分治的思想。

Step1.每次在无序的序列中选取一个基准数。

Step2.然后将大于和小于基准数的元素分别放置于基准数两边。(前面部分的元素均小于或等于基准数,后面部分均大于或等于基准数)

Step3.然后采用分治法(递归)分别对两侧部分重复上述操作,直至整个序列有序(递归结束)。

排序的具体步骤

有人会问啥时候能确定有序,使递归结束?

在这里先介绍一下排序过程,使之具体化,不抽象。我们总是选取序列中第一个数作为基准数。

以 68,72,93,60,17,52,9,35,99 这一组数据为例。

第一步 

1.确定 68 为基准数,把 68 从数组中取出。(黄色方块代表空位

2.从最右端开始,查找小于基准数 68 的数,找到 35 将其移至空位。(灰色代表已经遍历过的数) 

3. 接下来,从最左端未遍历过的元素 72 开始,从左至右查找大于基准数 68 的数(找到 72 ),将其移至空位。

4.继续从最右端未被遍历的元素 9 开始,从右至左扫描比基准数 68 小的数(找到 9 ),将其移动至左侧空出来的元素中。

5.重复执行步骤 3 、4 。

此时左边的数都小于等于基准数,右边的数都大于等于基准数。

第二步

采用分治法分别对左右部分运用第一步的方法进行递归操作,直至整个数组有序,以右部分为例(更简单说明):

选取 93 为基准数,经过第一步操作得到:

此时已经有序,从上图中可以轻易得知:当左右部分数的个数小于等于 1 时,这个数组有序。所以递归结束的条件是区间元素小于等于 1 个。

读者还可以从左部分为例证明。

全部代码

void QuickSort(int arr[], int low, int high)
{
	if (low >= high) //区间只有一个数或者不存在此区间,递归结束
	{
		return;
	}

	int i = low;
	int j = high;
	int base = arr[low]; //选取区间第一个数为基准数

	while (i < j )
	{
		while (i < j && arr[j] >= base) {
			j--;
		}//找到一个小于基准数的数

		if (i < j)
		{
			arr[i++] = arr[j]; 
		}

		while (i < j && arr[i] <= base) {
			i++;
		}//找到一个大于基准数的数

		if (i < j)
		{
			arr[j--] = arr[i]; 
		}
	} //循环结束后,i和j值相等

	arr[i] = base; //arr[j] = base;也可以

	//对左右两部分递归上面操作
	QuickSort(arr, low, i - 1); 
	QuickSort(arr, i + 1,high);
}


int main(void)
{
	
	int arr[] = { 68,72,93,60,17,52,9,35,99 };
	int len = sizeof(arr) / sizeof(arr[0]);

	QuickSort(arr, 0, len - 1);

	for (int i = 0; i < len; i++)
	{
		cout << arr[i] << " ";
	}

	return 0;
}

相关推荐

  1. 排序算法——快速排序

    2024-01-11 06:06:05       39 阅读
  2. 排序算法——快速排序

    2024-01-11 06:06:05       39 阅读
  3. 排序算法-快速排序

    2024-01-11 06:06:05       43 阅读
  4. 排序算法——快速排序

    2024-01-11 06:06:05       14 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-11 06:06:05       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-11 06:06:05       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-11 06:06:05       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-11 06:06:05       18 阅读

热门阅读

  1. 前端基础 keep-alive的使用(Vue)

    2024-01-11 06:06:05       42 阅读
  2. Awesome Mac:好用的Mac应用程序、软件以及工具

    2024-01-11 06:06:05       37 阅读
  3. Windows系统Copilot使用方案

    2024-01-11 06:06:05       63 阅读
  4. 如何用VsCode安装Copilot

    2024-01-11 06:06:05       38 阅读
  5. git 上传小知识

    2024-01-11 06:06:05       37 阅读
  6. 开源Vue3组件库

    2024-01-11 06:06:05       38 阅读
  7. Web前端篇——el-date-picker日期弹出框大小的修改

    2024-01-11 06:06:05       30 阅读
  8. 191. 位1的个数

    2024-01-11 06:06:05       42 阅读
  9. 哈希链接修改参数并返回

    2024-01-11 06:06:05       33 阅读