若一组记录的关键字为46,79,56,38,40,84,利用快速排序的方法,以第一个记录为基准得到的第一次划分结果为
时间: 2024-03-12 18:50:27 浏览: 227
初始状态下,以第一个记录 46 为基准,左右指针分别指向数列的首尾:
```
46, 79, 56, 38, 40, 84
^ ^
left right
```
首先右指针从右向左扫描,寻找第一个小于基准数的数,找到数值为 84 的记录,右指针停止移动。接着左指针从左向右扫描,寻找第一个大于基准数的数,找到数值为 56 的记录,左指针停止移动。此时交换左右指针所指的记录:
```
46, 56, 79, 38, 40, 84
^ ^
left right
```
右指针继续向左移动,寻找下一个小于基准数的数,找到数值为 40 的记录,右指针停止移动。左指针继续向右移动,寻找下一个大于基准数的数,此时左指针已经扫描到了右指针的位置,扫描结束。
最后交换基准数和左指针所指的记录:
```
40, 56, 79, 38, 46, 84
^
left
```
第一次划分的结果为基准数 46 左侧的数均比 46 小,右侧的数均比 46 大:
```
40, 56, 38, 46, 79, 84
|
基准数 46
```
相关问题
若一组记录的关键字为146,79,56,38,40,84),利用快速排序的方法,以第一个记录为基准得到的第一次划分结果为
初始状态下,以第一个记录 146 为基准,左右指针分别指向数列的首尾:
```
146, 79, 56, 38, 40, 84
^ ^
left right
```
首先右指针从右向左扫描,寻找第一个小于基准数的数,找到数值为 84 的记录,右指针停止移动。接着左指针从左向右扫描,寻找第一个大于基准数的数,找到数值为 79 的记录,左指针停止移动。此时交换左右指针所指的记录:
```
146, 79, 56, 38, 40, 84
^ ^
left right
```
接着右指针继续向左移动,寻找下一个小于基准数的数,找到数值为 40 的记录,右指针停止移动。左指针继续向右移动,寻找下一个大于基准数的数,找到数值为 56 的记录,左指针停止移动。再次交换左右指针所指的记录:
```
146, 56, 40, 38, 79, 84
^ ^
left right
```
右指针继续向左移动,寻找下一个小于基准数的数,找到数值为 38 的记录,右指针停止移动。左指针继续向右移动,寻找下一个大于基准数的数,此时左指针已经扫描到了右指针的位置,扫描结束。
最后交换基准数和左指针所指的记录:
```
38, 56, 40, 146, 79, 84
^
left
```
第一次划分的结果为基准数 146 左侧的数均比 146 小,右侧的数均比 146 大:
```
38, 56, 40, 146, 79, 84
|
基准数 146
```
已知一组记录的关键字序列为(56,39,81,23,67,34,12,45),请选择一种排序方法,把关键字序列排为递增的序列。 (1)请写出所选用的排序方法的名字。 (2)请写出每一趟排序的结果。 (3)请写出您所选排序方法的排序算法。
好的,针对你的问题,我的回答如下:
1. 所选用的排序方法的名字是快速排序。
2. 快速排序的每一趟排序的结果如下:
第1趟排序:
首先选择一个枢轴元素(pivot),一般选择第一个元素作为枢轴,即pivot=56。然后从序列的右端开始向左扫描,找到第一个小于枢轴的元素,将其与枢轴元素交换位置,得到序列:
(45, 39, 81, 23, 67, 34, 12, 56)
接着从序列的左端开始向右扫描,找到第一个大于枢轴的元素,将其与枢轴元素交换位置,得到序列:
(45, 39, 12, 23, 34, 56, 67, 81)
此时,枢轴元素56已经就位,左边的元素都比它小,右边的元素都比它大。然后将序列分成两个子序列,分别对左右两个子序列进行快速排序。
第2趟排序:
对左子序列(45, 39, 12, 23, 34)进行快速排序,过程与第1趟排序类似,得到序列:
(34, 39, 12, 23, 45)
第3趟排序:
对右子序列(56, 67, 81)进行快速排序,得到序列:
(56, 67, 81)
最终得到的递增序列为:
(12, 23, 34, 39, 45, 56, 67, 81)
3. 快速排序的排序算法如下:
```
void quickSort(int a[], int left, int right) {
if (left < right) {
int i = left, j = right, pivot = a[left];
while (i < j) {
while (i < j && a[j] >= pivot) j--;
if (i < j) a[i++] = a[j];
while (i < j && a[i] < pivot) i++;
if (i < j) a[j--] = a[i];
}
a[i] = pivot;
quickSort(a, left, i - 1);
quickSort(a, i + 1, right);
}
}
```
其中,a是待排序的数组,left和right分别表示排序区间的左右端点。算法的核心是分治思想和双指针扫描,具体过程如下:
- 选择一个枢轴元素pivot,一般选择左端元素。
- 从右端开始向左扫描,找到第一个小于枢轴的元素,将其交换到左端。
- 从左端开始向右扫描,找到第一个大于枢轴的元素,将其交换到右端。
- 重复2和3的过程,直到左右指针相遇。
- 将枢轴元素交换到中间位置,此时枢轴元素已经就位。
- 分别对左右两个子序列进行快速排序,递归完成整个排序过程。
快速排序的时间复杂度为$O(nlogn)$,空间复杂度为$O(logn)$。由于快速排序采用了分治思想,所以它的排序效率通常比较高,是常用的排序算法之一。
阅读全文