数据结构学习day1 快速排序

https://baike.baidu.com/item/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/369842?fr=aladdin#2

快速排序:

1. 设置变量i=0, j=N-1,设置关键数据,也就是比较的数据key,key可以随便取,也可以取key=A[0]

2. 从j开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]的值赋给A[i];

3. 从i开始向后搜索(i++),找到第一个大于key的A[i],将A[i]的值赋给A[j];

4. 重复第2、3步,直到i=j; (2,3步中,没找到符合条件的值,即2中A[j]不小于key,3中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)
 
演示:
第一步:设置i,j和key
0 1 2 3 4 5 6 7 8 9
2 7 5 6 0 8 4 1 9 3
 
 
 
i=0, j=9, key=2
 
第二步:j从后向前搜索,找到第一个于2的值1,交换
0 1 2 3 4 5 6 7 8 9
1 7 5 6 0 8 4 2 9 3
 
 
 
i=0, j=7, key=2
 
第三步:i从前向后搜索,找到第一个于2的值7,交换
0 1 2 3 4 5 6 7 8 9
1 2 5 6 0 8 4 7 9 3
 
 
 
i=1, j=7, key=2
 
重复第二步,j从后向前搜索
0 1 2 3 4 5 6 7 8 9
1 0 5 6 2 8 4 7 9 3

i=1, j=4, key=2

重复第三步,i从前向后搜索

0 1 2 3 4 5 6 7 8 9
1 0 2 6 5 8 4 7 9 3

i=2, j=4, key=2

重复第二步,j从后向前搜索,此时i=j=2

0 1 2 3 4 5 6 7 8 9
1 0 2 6 5 8 4 7 9 3
 
 
 
第四步:将key左边和右边的再分别进行以上步骤排序,直到最终排好
 
 
C++实现:
#include <iostream>
 
using namespace std; 
void Qsort(int a[], int low, int high)
{
    if(low >= high)
    {
        return;
    }
    int first = low;
    int last = high;
    int key = a[first];/*用字表的第一个记录作为枢轴*/
 
    while(first < last)
    {
        while(first < last && a[last] >= key)
        {
            --last;
        }
        a[first] = a[last];/*将比第一个小的移到低端*/
        while(first < last && a[first] <= key)
        {
            ++first;
        }
        a[last] = a[first];    
/*将比第一个大的移到高端*/
    }
    a[first] = key;/*枢轴记录到位*/
    Qsort(a, low, first-1);
    Qsort(a, first+1, high);
}
int main()
{
    int a[] = {57, 68, 59, 52, 72, 28, 96, 33, 24};
    Qsort(a, 0, sizeof(a) / sizeof(a[0]) - 1);/*这里原文第三个参数要减1否则内存越界*/
    for(int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
    {
        cout << a[i] << "";
    }
    return 0;
}/*参考数据结构p274(清华大学出版社,严蔚敏)*/

python实现

def quick_sort(data):    
    """快速排序"""    
    if len(data) >= 2:  # 递归入口及出口        
        mid = data[len(data)//2]  # 选取基准值,也可以选取第一个或最后一个元素        
        left, right = [], []  # 定义基准值左右两侧的列表        
        data.remove(mid)  # 从原始数组中移除基准值        
        for num in data:            
            if num >= mid:                
                right.append(num)            
            else:                
                left.append(num)        
        return quick_sort(left) + [mid] + quick_sort(right)    
    else:        
        return data
 
 
 
 

猜你喜欢

转载自www.cnblogs.com/happyfan/p/10529582.html