基础快速排序(C语言实现)

 思路解释:

  1. 如果起始位置l小于结束位置r,执行以下操作:
  2. 定义变量ijx,分别表示子序列的起始位置、结束位置和基准元素。
  3. 通过一次扫描,将比基准元素小的元素放在基准元素的左边,将比基准元素大的元素放在基准元素的右边。这一步骤使用两个指针ij,分别从序列的两端开始向中间移动,找到需要交换的元素,并进行交换,直到ij相遇。
  4. 将基准元素放到最终的位置,即a[i]的位置。
  5. 递归调用Quick_Sort函数,对基准元素左边的子序列进行排序,起始位置为l,结束位置为i-1
  6. 递归调用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