基本思想:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,再对两部分记录分别进行继续排序,使得整个记录有序。
首先任选一个记录(通常选第一个记录)作为基准数。
一趟快速排序的做法:
首先从high所指的位置起向前搜索找到第一个关键字小于base的记录,和枢轴记录互换;
然后从low所指的位置起向后搜索找到第一个关键字大于base的记录,和枢轴记录互换;
重复这两步直至low=high为止。
49 38 65 97 76 13 27 49
初始关键字:49 38 65 97 76 13 27 49
high 49 = 49
27 < 49 互换 27 38 65 97 76 13 49 49
low 38 < 49 65 > 49 互换 27 38 49 97 76 13 65 49
high 13 < 49 互换 27 38 13 97 76 49 65 49
low 97 > 49 互换 27 38 13 49 76 97 65 49
high 76 > 49
low = high 49 = 49 {27 38 13} 49 {76 97 65 49} 完成一趟排序
一次划分结果: {27 38 13} 49 {76 97 65 49}
两边分别进行快速排序:{13} 27 {38} {49 65} 76 {97}
有序序列**{13 27 38 49 49 65 76 97}**
代码块:
#include<stdio.h>
void Swap(int arr
[], int low
, int high
)
{
int tmp
;
tmp
= arr
[low
];
arr
[low
] = arr
[high
];
arr
[high
] = tmp
;
}
int Partition(int arr
[], int low
, int high
)
{
int base
= arr
[low
];
while (low
< high
) {
while (low
< high
&& arr
[high
] >= base
) {
high
--;
}
Swap(arr
, low
, high
);
while (low
< high
&& arr
[low
] <= base
) {
low
++;
}
Swap(arr
, low
, high
);
}
return low
;
}
void QuickSort(int arr
[], int low
, int high
)
{
int base
;
if (low
< high
) {
base
= Partition(arr
, low
, high
);
QuickSort(arr
, low
, base
- 1);
QuickSort(arr
, base
+ 1, high
);
}
}
int main()
{
int arr
[] = { 48,62,35,77,55,14,35,98 };
int length
= sizeof(arr
) / sizeof(arr
[0]);
int i
, j
;
printf("排序前:\n");
for (i
= 0; i
< length
; i
++) {
printf("%d ", arr
[i
]);
}
printf("\n排序后:\n");
QuickSort(arr
, 0, length
- 1);
for (j
= 0; j
< length
; j
++) {
printf("%d ", arr
[j
]);
}
printf("\n");
return 0;
}
运行后: