快速排序模板

#include <bits/stdc++.h>

using namespace std;

const int N = 100005;
int a[N];

//快速排序
void quickSort(int q[], int l, int r){
    if(l >= r){
        //如果相等应该指的是数组只有一个元素,
        //而大于的话暂时我也想不明白
        return;
    }
    
    int index = q[(l + r) >> 1];   //这个值取谁都行,但是要注意边界问题
    // printf("index = %d\n", index);
    int i = l - 1, j = r + 1;   //同时走两个循环,先往后放一个位置,后续的操作都先做移动操作
    // printf("l = %d\n", l);
    // printf("r = %d\n", r);

    
    while(i < j){
        //只要i指针在j指针的左边,两个指针就都要继续走
        //i指针,先移动,再判断,
        //当i指针指向的位置的值大于或等于index的值时,就不循环了
        //此时i指针指在这个大于或等于index的值的位置
        do{
            i++;
        }while(q[i] < index);
        //j指针同理
        do{
            j--;
        }while(q[j] > index);
        //他们俩都停下的时候
        //如果i指针在j指针的左边,就交换
        //如果i指针不在j指针的左边的话,if进不去,下一次循环也进不去
        if(i < j){
            // printf("q[%d] = %d\n", i, q[i]);
            // printf("q[%d] = %d\n", j, q[j]);
            q[i] = q[i] ^ q[j];
            q[j] = q[i] ^ q[j];
            q[i] = q[i] ^ q[j];
            
            //swap(q[i], q[j]);
        }
    }
    /*
    for(int i = l; i <= r; i++){
        if(i == r){
            printf("%d\n", a[i]);
        }else {
            printf("%d ", a[i]);
        }
    }
    */
    //当i指针不在j指针的左边的话,就证明这个l-r都排好了,
    //然后递归的再分两个区间,直到排序完毕
    quickSort(q, l, j);
    quickSort(q, j + 1, r);
    
}
int main(){
    int n;  //需要排序的个数
    scanf("%d", &n);
    for(int i = 0; i < n; i++){
        scanf("%d", &a[i]);
    }
    quickSort(a, 0, n - 1);
    for(int i = 0; i < n; i++){
        if(i == n - 1){
            printf("%d", a[i]);
        }else {
            printf("%d ", a[i]);

        }
    }
    
    return 0;
}
上一篇:云学编程的第13天—【微软官方python入门教程 P27-P28笔记】2021-11-13 循环Loops


下一篇:学习C语言