Skip to content
本页目录

5快速排序-其它3

发布时间:

思想

第一个为中心轴或pivot ,值取出存入第三变量中,从第1位置,和最后位置,定义i和j 指针,先从j向前找比pivot小的位置,将此值放到i位置,i向前移动找的第一个大于pivot的值,再将值移动到j位置,依次进行,当两个指针指向同一位置,将pivot放置此处。完成一趟排序。

js
#include <iostream>
using namespace std;

/*  第一个为中心轴或pivot ,值取出存入第三变量中,从第1位置,和最后
位置,定义i和j 指针,先从j向前找比pivot小的位置,将此值放到i位置,i向前
移动找的第一个大于pivot的值,再将值移动到j位置,依次进行,当两个指针指向同
一位置,将pivot放置此处。完成一趟排序*/
int copy1 = 0;
int a[] = {3, 1, 7, 4, 9, 6, 2, 5, 8};
int len = sizeof(a) / sizeof(a[0]);
int pmoves = 0;
int swapNumber = 0;
void showA() {
    for (int i = 0; i < len; i++) {
        cout << a[i] << " ";
    }
    cout << "---" << copy1 << endl;
}

void qsort(int l, int r) {
    copy1 = a[l];
    swapNumber++;
    a[l] = -1;
    showA();
    int i = l;
    int j = r;

    while (j > i) {
        while (j > i && a[j] >= copy1) {  // 右边找到小的
            j--;
            pmoves++;
        }
        if (i == j) {//两指针重叠时推出
            break;
        } else {//移动到左边空位
            a[i] = a[j];
            swapNumber++;
            a[j] = -1;
        }
        showA();

        while (i<j && a[i] < copy1) {  // 左边大的
            i++;
            pmoves++;
        }
        if (i == j) {//两指针重叠时推出
            break;
        }else{//移动到右边空位
            a[j] = a[i];
             swapNumber++;
            a[i] = -1;
        }
        showA();
    }
    a[j] = copy1;//复制的值放回空位;
    showA();
    if (j - l > 1)
        qsort(l, j - 1);  // 若未到两个数的边界,则递归搜索左右区间
    if (r - (j+1) > 1)
        qsort(j+1, r);
}

int main() {
    showA();
    qsort(0, len - 1);
    cout << " 交换次数:" << swapNumber << endl;
    cout << " 指针移动数:" << pmoves << endl;
}

   

上次更新: