快速排序

一、记录一种快速排序算法的思路

  • 基本思路:在一组数据中找出一个参考点的数据来做比较,然后将数据以参考点为准分成左右两部分,左边的是小于参考点的数据,右边是大于参考点的数据,分类结束后变成两组新的数据,对这两组数据分别循环重复该过程,如此直到每个部分都只有一个元素时即完成排序。

  • 基本步骤:

  1. 找参考点,给定一个范围为 i 到 j 的数组,在数组数据中找出参考点。将数据的左边第一个数(参考
    点在左)i 位置作为参考点数据赋值给单独的变量 key,然后从右边 j 开始,比较j位置的元素val[j]是否大于参考点数据key,若是,则将 j 减一左移,直到 i <= j 条件不满足退出,若不是,则交换 i 和 j 位置的数据。(从右边开始,将右边数据赋值给 i ,i 的第一个变量赋值到key正好又空缺一个位置可以填充数组,而不至于数组丢 失)
  2. 接下来判断左边 i 位置的数据是否小于参考点数据 key,若不是则赋值给 j 位置的数据,若是,则继续左移数据,直到 i <= j 条件不满足退出。
  3. i 等于 j 的时候,返回 j 位置的数据即是参考点的数据
  4. 循环重复以上1,2,3步骤,将每次得到的参考点数据带入基准点左边数组进行排列,然后再排列右边的数组。
    ……
  • 个人理解:
    快速排序是分治的一种算法,将数据分成各个部分来分别处理,每个部分处理好了,合并起来整个数据自然就有序了。在该快速排序中,其中分左右两个部分的算法是关键,可以取中间一个数据当参考点,判断大于的放一边,小于的放另外一边,至于数组长度坑位是有限的,所以必然是需要一个临时的变量来存放待交换的数据,这里面参考点数据可以起这个作用,一方面用来比较,一方面可以当空出来的那个坑位,用来当交换用的临时变量。如此每次交换都会移动这个位置,直到最后比较结束,将这个基准变量填回这个坑位,返回这个基准变量的位置,等待下一次处理。

  • 注意点:
    获取参考点时,条件判断不满足很容易造成死循环,无法退出。

    • a. 参考点做比较判断,待比较元素数值应当是右边大于等于或左边是小于等于参考点数值(升序排列)。
    • b. 左边做参考点,则从右边开始判断,右边参考点从左边开始
    • c. quick 排序函数本身,只有一个元素时要结束退出递归

算法示例:

int qartion(int arr[],int len,int lo,int hi)
{
    int res = 0;
    int key = arr[lo];
    int i = lo,j = hi;
    while(i < j)
    {
            while(arr[j] >= key && j > i)j--;
            if(j > i)
                arr[i] = arr[j];
            while(arr[i] <= key && i < j)i++;
            if(i < j) 
                arr[j] = arr[i];
    }
    arr[i] = key;
    res = i;
    return res;
}

void quick_sort(int arr[],int len,int lo,int hi)
{
    if(lo >= hi)return;
    int m = qartion(arr,len,lo,hi);
    quick_sort(arr,len,lo,m-1);
    quick_sort(arr,len,m+1,hi);
}

学习之余记录总结的笔记
个人理解,若有不对欢迎请指出

你可能感兴趣的:(快速排序)