刚学完的知识点,以下是我对老师内容的理解。不足之处请多多指教!
快速排序
算法思想:
⑴ 依据表
L=(
a
1
, a
2
, a
3
,
…
, a
i
,
…
, a
n
)
的第一个元素
a
1
,将
取
L
“
划分
”成左右
2
个逻辑子表,使得
a
1
小于左子表的所有元素,
且大于右子表的所有元素;
⑵ 左右子表分别递归处理。
划分方法
:
(
low
和
high
初始值分别指向
L的
最左和最右的单元
)
(1)
当
low
<
high
时,重复做如下处理:
(1.1)
向左移动
high
,将首次遇到的
小于
L[
low
]的
L[
high
]
与
L[
low
]
交换;
(1.2)
向右移动
low
, 将首次遇到的
大于
L[
high
]的
L[
low
]
与
L[
high
]
交换;
以下是具体代码:
#include<stdio.h>
QuickSort(int R[], int s, int t) //对R[s]至R[t]的元素进行快速排序
{
int i = s, j = t, tmp;
tmp = R[s];
if (s < t) //区间内至少存在2个元素的情况
{
tmp = R[s]; //用区间的第1个记录作为基准
while (i != j) //从两端交替向中间扫描,直至i=j为止
{
while (j > i && R[j] >= tmp) j--;
R[i] = R[j];
while (i < j && R[i] <= tmp) i++;
R[j] = R[i];
}
R[i] = tmp;
QuickSort(R, s, i - 1); //对左区间递归排序
QuickSort(R, i + 1, t); //对右区间递归排序
}
}
int main()
{
int i,j, n,R[100];
printf("请输入需要比较的元素个数:");
scanf("%d", &n);
printf("请依次输入需要排序的数组元素:\n");
for (i = 0;i < n;i++)
{
scanf("%d", &R[i]);
}
i = 0;
j = n - 1;
QuickSort(R, i, j);
printf("\n");
printf("排序后的数组次序如下:\n");
for (i = 0;i < n;i++)
{
printf("%5d", R[i]);
}
printf("\n");
}
代码效果图: