对{ 503,87,512,61,908,170,897,275,653,426}进行快速排序、堆排序,写出有变化的过程。
时间: 2023-10-03 22:05:26 浏览: 85
好的,让我来分别演示一下快速排序和堆排序的过程。
首先是快速排序:
快速排序的基本思想是选择一个基准元素,将序列分成左右两部分,左边的元素都小于基准元素,右边的元素都大于基准元素,再对左右两部分分别进行快速排序,最终得到一个有序序列。
以数组{ 503,87,512,61,908,170,897,275,653,426}为例,选择基准元素为503,进行一次快速排序的过程如下:
1. 将基准元素503放在序列的最左侧,用i记录左侧位置,j记录右侧位置。
2. 从右侧开始,找到第一个小于等于基准元素的数,将其与基准元素交换。这里找到的是426,将其与503交换。
{ 426, 87, 512, 61, 908, 170, 897, 275, 653, 503}
3. 从左侧开始,找到第一个大于等于基准元素的数,将其与基准元素交换。这里找到的是512,将其与503交换。
{ 426, 87, 503, 61, 908, 170, 897, 275, 653, 512}
4. 重复步骤2、3直到i=j,此时i=j=2,将基准元素503放回序列中i的位置。
{ 426, 87, 503, 61, 908, 170, 897, 275, 653, 512}
5. 对左侧序列{426, 87}和右侧序列{908, 170, 897, 275, 653, 512}分别进行快速排序。
左侧序列{426, 87}排序后为{87, 426},右侧序列{908, 170, 897, 275, 653, 512}排序后为{170, 275, 512, 653, 897, 908}。
6. 将左右两个有序序列合并,得到最终的有序序列。
{ 87, 426, 170, 275, 512, 653, 897, 908}
接下来是堆排序:
堆排序的基本思想是将待排序序列构建成一个二叉堆,然后依次将堆顶元素取出,放到有序序列的末尾。
以数组{ 503,87,512,61,908,170,897,275,653,426}为例,堆排序的过程如下:
1. 建立大根堆。从最后一个非叶子节点开始,依次将其与子节点比较,如果子节点比其大,则交换两者位置,直到整个序列构成一个大根堆。
{908,653,897,275,503,170,512,61,87,426}
2. 依次将堆顶元素取出,放到有序序列的末尾。每次取出堆顶元素后,将堆的大小减1,然后对剩余的元素重新构建大根堆。
第一次取出堆顶元素908,放到有序序列末尾,得到序列{ 426,653,897,275,503,170,512,61,87,908},此时堆的大小为9。
对剩余的元素重新构建大根堆,得到序列{897,653,512,275,503,170,426,61,87}。
第二次取出堆顶元素897,放到有序序列末尾,得到序列{ 87,653,512,275,503,170,426,61,897,908},此时堆的大小为8。
对剩余的元素重新构建大根堆,得到序列{653,503,512,275,426,170,87,61}。
重复上述操作,直到堆的大小为1,得到最终的有序序列。
{ 61,87,170,275,426,503,512,653,897,908}
阅读全文