重拾算法Day03-快速排序

快速排序基本思想

以 6 1 2 7 9 3 4 5 10 8 按从小到大排序 为例进行说明:

  1. 以6为基准,小于6的放在6的左边,大于6的放在6的右边。
  2. 设置两个标志器i=0, j=9; i在数组的最左边,j在数组的最右边。
  3. j先动,依次比较a[j]<6,如果不成立,j--; 如果成立则j停止。如果j<i,停止。
  4. i再动,依次比较a[i]>6, 如果不成立,i++;如果成立i停止。如果j<i,停止。
  5. 如果i=j,就将6与a[j]进行交换。
    如此进行一轮:等到的结果是
    3 1 2 5 4 6 9 7 10 8
    6 左边的都小于6,6右边的都大于6。
    然后再排序 3 1 2 5 4
    然后再排序 9 7 10 8

代码实现

#include <stdio.h>
int a[100];
int n;

void quicksort(int left, int right)
{
    if (left >= right) {
        return;
    }
    int i, j;
    i=left;
    j=right;
    int temp = a[left]; //基准数据
    while (i!=j) {
        while (a[j]>=temp && j>i) {
            j--;
        }
        while (a[i]<=temp && j>i) {
            i++;
        }
        
        if (i<j) {
            int k = a[i];
            a[i] = a[j];
            a[j] = k;
        }
        
    }
    
    a[left] = a[i];
    a[i] = temp;
    
    quicksort(left, i-1);
    quicksort(i+1, right);
    
    return;
}

int main(int argc, const char * argv[]) {
    // insert code here...
    
    scanf("%d", &n);
    for (int i=0; i<n; i++) {
        scanf("%d", &a[i]);
    }
    
    quicksort(0, n-1);
    for (int i=0; i<n; i++) {
        printf("%d ", a[i]);
    }
    printf("\n");
    
    return 0;
}

总结

快速排序之所以比较快,因为相比冒泡排序,每次交换都是跳跃式的。每次排序都设置一个基准点,将小于等于基准点的数全部放在基准点的左边,将大于等于基准点的数全部放在基准点的右边。这样在每次交换的时候就不会像冒泡排序一样只能在相邻的数之间进行交换。交换的距离也大得多了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 10,592评论 0 52
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 9,086评论 0 15
  • quicksort可以说是应用最广泛的排序算法之一,它的基本思想是分治法,选择一个pivot(中轴点),将小于pi...
    黎景阳阅读 3,297评论 0 1
  • 半夜睡不着,早上又早早的自然醒。像个有心事的失眠人,却满脑子放空。 坐着发呆,想到一个词:虚度光阴。回来后整日的无...
    禾必阅读 1,183评论 0 0
  • 一 弟弟的房子交房了,他兴奋地准备装修,目标明确:要装成样板房那样。当初看到样板房,他眼前一亮,这是他梦想中的家。...
    王月冰阅读 3,720评论 0 3