本人是编程新手,为了考研和后续的学习而已。
平台的文本编辑不会用,时间紧迫不想在花时间学习平台的编辑器。
所以直接复制粘贴过来,免费分享。
因为都是自己的理解,都是大白话,所以有一些地方表述不合适或不够准确的请大佬帮忙更正。
更加希望有前辈指教,学生定虚心学习。
#include <stdio.h>
// 两数交换函数
void swap(int &a, int &b){
int t;
t = a;
a = b;
b = t;
}
// 快排函数
// 参数:待排数组,待排数组的左端点,待排数组的右端点
void quick_sort(int arr[], int left, int right){
// 要从左到右排序,判断左边的起始位置是否是“左边”
if(left >= right){
return;
}
// 声明参考值 x,以及左侧端点位置、右侧端点位置。
// +1 是为了通过偏移量杜绝数组以0开始容易搞混。
int x = arr[(left + right + 1)/2],i = left - 1, j = right + 1;
while(i < j){
/* 先使端点位置到达真正的数组两端的元素的位置。
* (本算法按照快排-升序sort为例,呈现:left < x < right 的结果)
* 对比当前元素值与参考值的大小,如果是小于,右移指针。(如果一直都是小于那说明该数组本身就是升序的)
* 直到 arr[left] > x 后,则要看右侧的元素值与 x 的大小。
* 右指针同左指针一样,直到 arr[right] < x 后。
* 此时呈现出:arr[left] > x > arr[right]
* 则将两个当前值交换,变成:arr[left] < x < arr[right]
*
* 注:操作的是指针的位置对比,理应是:i < x < j,当循环变成 i > j 时说明以全部遍历完成。
* */
do i++; while (arr[i] < x);
do j--; while (arr[j] > x);
if(i < j){
swap(arr[i], arr[j]);
}
}
// 递归
quick_sort(arr, left, i - 1); //x的左半部分
quick_sort(arr, i, right); //x的右半部分
}
int main(void) {
int n;//共有多少个数据
scanf("%d", &n);
int arr[n]; // 数组存放数据
for(int i = 0; i < n; i++){ // 循环输入数据本身
scanf("%d", &arr[i]);
}
// 执行快排
quick_sort(arr, 0, n-1);
// 遍历
for(int i = 0; i < n; i++){
printf("%d ",arr[i]);
}
}