文章标题

来源:互联网 发布:安捷伦数据采集器软件 编辑:程序博客网 时间:2024/06/02 01:27

快速排序算法C++

快速排序算法每次先随机挑选一个数,把大于这个数的放在右边,小于这个数的放在左边,然后再分别对左右两个区间进行相同的操作。不断递归便能使数组有序;

图片来自牛客网

划分过程一

划分过程二

划分过程三

partition区间划分

区间划分是快速排序算法的核心,主要思路一:

1. 随机选择一个数作为划分值,并将其交换到区间最后一个元素的位置
2. 同时维护一个区间来表示小于等于该元素值所构成的区间
3. 从最区间左边开始将元素i与划分值(最后一个元素)进行比较,如果小于等于划分值则将i与小于等于区间的下一个元素交换位置,并将小于等于区间右移一位

实现方式一:

int partition(int *a, int s, int e){//区间划分    int lower = s-1;    for (int i = s; i < e; i++){        if (a[i] < a[e]){            swap(a[i], a[++lower]);        }    }    swap(a[++lower], a[e]);    return lower;}void fastsort(int *a, int s,int e){//递归    if (s >= e)return;    //int mid = fastPartition(a, s, e);    int mid = partition(a, s, e);    fastsort(a, s, mid-1);    fastsort(a, mid + 1, e);}

实现方式二:

int fastPartition(int *a, int s, int e){//快速排序    int n = e - s + 1;    int temp = a[s];    int ans = 0;    for (int i = s, j = e; j != i; ans = i){        if (a[i] > temp){            swap(a[i], a[j]), j--;            continue;        }        if (a[j] < temp){            swap(a[i], a[j]), i++;            continue;        }        if (a[i] == temp){            j--;            continue;        }        if (a[j] == temp){            i++;            continue;        }       }    return ans;}int partition(int *a, int s, int e){    int lower = s-1;    for (int i = s; i < e; i++){        if (a[i] < a[e]){            swap(a[i], a[++lower]);        }    }    swap(a[++lower], a[e]);    return lower;}
原创粉丝点击