一天一算法(1):快速排序

    xiaoxiao2022-07-13  138

    前言

    我去网上查看了快速排序的代码,千篇一律,代码简直一个模子里面印出来的,这样没意思,用的都是别人的思路。于是我自己动手写了一个,虽然代码不够简洁,但是我觉得排序的目的应该达到了

    思路

    快速排序算法无非就是利用左右两个指针,向左或者向右遍历数组,并且与基准点比较,从而达到排序的目的 首先: 假设我们的无序数列是:5,11,1,2,8,6,9 然后声明两个int变量i和j,然后我们让 i 和 j 分别指向数组的两端,第一次遍历的话,i=0,j=6,基准点为5。 之后我再声明一个int类型的变量step,当step=0时,代表由右向左遍历数组,当step=1时,代表从左向右遍历数组。

    第一轮遍历

    开始: i=0 , j=6,step=0,基准点为5 第一次寻找: j=6,所以 j 指向9,step=0,所以由右向左遍历,因为9>5,所以我们让 j–,直到找到小于5的数,当 j=3的时候,指向的2小于5,则让2替代以 i 为索引的数,然后将step置为1,这时无序数组为:2,11,1,2,8,6,9 ,各个参数为 i=0 , j=3 ,step=1

    第二次寻找: 由于step=1,所以由左向右遍历,我们让 i++,直到找到第一个比5大的数,所以在 i=1的时候,找到11比5大,则让 11 替代以 j 为索引的数,之后将step置为0,这时无序数组为:2,11,1,11,8,6,9 ,各个参数为 i=1 , j=3 ,step=0

    第三次寻找: step=0,所以由右向左遍历,让 j–,直到找到小于5的数,当j=2的时候,找到1 小于5,所以让 1 替代以 i 为索引的数,之后将step置为1,这时无序数组为:2,1,1,11,8,6,9 ,各个参数为 i=1 , j=2 ,step=1

    第四次寻找: 由于 i=1 , j=2 所以没有遍历的必要了,我们将5直接替代 以 j 为索引的数,所以无序数组为:2,1,5,11,8,6,9 这时我们发现,5左边都是比他小的数,右边都是比他大的数。

    最后: 我们利用递归,对5左边和右边的数执行快速排序就行了。

    代码

    public static void FastSort(long[] a, int front, int low) { if (front > low) return; int left = front; int right = low; long k = a[left];//设置基准点 int step = 0; while (front <low) { switch (step) { case 0: if (a[low] < k) { a[front] = a[low]; step = 1; } else { low--; } break; case 1: if (a[front] >= k) { a[low] = a[front]; step = 0; } else { front++; } break; } } a[front] = k; if (low<left) return; FastSort(a,left, low - 1); if (front >=right) return; FastSort(a, front+1,right); }
    最新回复(0)