基础快速排序(C语言实现)
思路解释:
- 如果起始位置
l
小于结束位置r
,执行以下操作: - 定义变量
i
、j
和x
,分别表示子序列的起始位置、结束位置和基准元素。 - 通过一次扫描,将比基准元素小的元素放在基准元素的左边,将比基准元素大的元素放在基准元素的右边。这一步骤使用两个指针
i
和j
,分别从序列的两端开始向中间移动,找到需要交换的元素,并进行交换,直到i
和j
相遇。 - 将基准元素放到最终的位置,即
a[i]
的位置。 - 递归调用
Quick_Sort
函数,对基准元素左边的子序列进行排序,起始位置为l
,结束位置为i-1
。 - 递归调用
Quick_Sort
函数,对基准元素右边的子序列进行排序,起始位置为i+1
,结束位置为r
。
#include <stdio.h>
void Quick_Sort(int a[], int l, int r) {
if (l < r) {
int i, j, x;
i = l;
j = r;
x = a[i];
while(i<j) {
while (i<j && a[j]>x) {
j = j-1; // 从右向左找第一个小于x的数
}
if (i < j) {
a[i] = a[j]; // 将小于x的值放在左边
i=i+1;
}
while (i < j && a[i] < x) {
i = i + 1; // 从左向右找第一个大于x的数
}
if (i < j) {
a[j] = a[i]; // 将大于x的值放在右边
j = j - 1;
}
}
a[i] = x;
Quick_Sort(a, l, i - 1);
Quick_Sort(a, i+1, r);
}
}
int main() {
int arr[] = { 30,40,60,10,20,50,2,3,4,5,1,2,4,6,7 };
Quick_Sort(arr, 0, 14);
for (int i = 0; i < 14; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
源数据:30,40,60,10,20,50,2,3,4,5,1,2,4,6,7
加粗为标准值
7 6 4 10 20 2 2 3 4 5 1 30 50 60
1 6 4 5 4 2 2 3 7 20 10 30 50 60
1 6 4 5 4 2 2 3 7 20 10 30 50 60
1 6 4 5 4 2 2 3 7 20 10 30 50 60
1 3 4 5 4 2 2 6 7 20 10 30 50 60
1 2 2 3 4 5 4 6 7 20 10 30 50 60
1 2 2 3 4 5 4 6 7 20 10 30 50 60
1 2 2 3 4 5 4 6 7 20 10 30 50 60
1 2 2 3 4 5 4 6 7 20 10 30 50 60
1 2 2 3 4 5 4 6 7 20 10 30 50 60
1 2 2 3 4 4 5 6 7 20 10 30 50 60
1 2 2 3 4 4 5 6 7 20 10 30 50 60
1 2 2 3 4 4 5 6 7 20 10 30 50 60
1 2 2 3 4 4 5 6 7 20 10 30 50 60
1 2 2 3 4 4 5 6 7 20 10 30 50 60
1 2 2 3 4 4 5 6 7 20 10 30 50 60
1 2 2 3 4 4 5 6 7 20 10 30 50 60
1 2 2 3 4 4 5 6 7 20 10 30 50 60
1 2 2 3 4 4 5 6 7 10 20 30 50 60
1 2 2 3 4 4 5 6 7 10 20 30 50 60
1 2 2 3 4 4 5 6 7 10 20 30 50 60
1 2 2 3 4 4 5 6 7 10 20 30 50 60
1 2 2 3 4 4 5 6 7 10 20 30 50 60
1 2 2 3 4 4 5 6 7 10 20 30 40 50
1 2 2 3 4 4 5 6 7 10 20 30 40 50
1 2 2 3 4 4 5 6 7 10 20 30 40 50
1 2 2 3 4 4 5 6 7 10 20 30 40 50
1 2 2 3 4 4 5 6 7 10 20 30 40 50