数据结构-快速排序

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 QuickSort(list,low,high):
    if high > low:
        #传入参数,通过Partitions函数,获取k下标值
            left = low
            right = high
            #将最左侧的值赋值给参考值k
            k = list[low]
            #当left下标,小于right下标的情况下,此时判断二者移动是否相交,若未相交,则一直循环
            while left < right :
                #当left对应的值小于k参考值,就一直向右移动
                while list[left] <= k:
                    left += 1
                # 当right对应的值大于k参考值,就一直向左移动
                while list[right] > k:
                    right = right - 1
                #若移动完,二者仍未相遇则交换下标对应的值
                if left < right:
                    list[left],list[right] = list[right],list[left]
            #若移动完,已经相遇,则交换right对应的值和参考值
            list[low] = list[right]
            list[right] = k
            QuickSort(list,low,right-1)
            # 递归排序列表k下标右侧的列表
            QuickSort(list,right+1,high)

list_demo = [6,1,2,7,9,3,4,5,10,8]
print(list_demo)
QuickSort(list_demo,0,9)
print(list_demo)

 

输出:

[6, 1, 2, 7, 9, 3, 4, 5, 10, 8]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

 

分而治之+递归

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

 

 
 
 
 
posted @ 2019-03-14 12:51  xyfun72  阅读(211)  评论(0编辑  收藏  举报