基本思想:与归并排序一样,快速排序也采用了分治法。将原问题分解成几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后再合并这些子问题的解来建立原问题的解。在快速排序中,因为子数组都是原址排序的,所以不需要合并操作。

第一轮交换

选定基准元素为60,左指针指向25,右指针指向13,左指针向右查找→大于60的元素,右指针向左查找←小于60的元素,找到就交换两个元素的位置,左右指针相遇则交换基准元素与中间元素,下表中为交换基准元素60和数24

原始数据 60 25 45 80 77 63 24 13
Swap 1 60 25 45 13 77 63 24 80
Swap 2 60 25 45 13 24 63 77 80
Swap 3 24 25 45 13 60 63 77 80

排序整体流程

quick_sort

算法如下

----------
/*排序算法:快速排序
时    间:2020年12月21日
时间复杂度:最好情形O(nlgn),平均情形O(nlgn),最差情形O(n^2)
空间复杂度:O(lgn)
稳  定  性:不稳定
by Ingran*/
----------
#include <stdio.h>
void Swap(int A[],int i,int j)
{
	int temp = A[i];
	A[i] = A[j];
	A[j] = temp;
}
int Partition(int A[], int l, int r)
{
    int x = A[l]; //取最左边的为基准元素
    int j = r+1;  
    int i = l;
    printf("\n\n基准元素为:%d\n",x);
    while(true)
    {
        while(A[--j] > x && j>l);
        while(A[++i] < x);
        if(i>=j)
    	break;	
        Swap(A,i,j);
    } 
    A[l] = A[i-1];
    A[i-1] = x;
    return i-1;
}
void Quick_Sort(int A[], int p, int r)//快速排序,参数为数组A,数组A的首元素下标和最后一个元素的下标
{
    int q = 0;
    if (p < r)
    {
        q = Partition(A, p, r);
        Quick_Sort(A, p, q - 1);
        Quick_Sort(A, q + 1, r);
    }
}
int main()
{
    int a[8] = {60,25,45,80,77,63,24,13};

    printf("待排数据:");
    for(int k=0;k<=7;k++)
    	printf("%d ",a[k]);
    printf("\n********************\n"); 
    
    
    Quick_Sort(a,0,7);
    
    
    printf("\n********************\n"); 
    printf("排序后:");
    for(int k=0;k<=7;k++)
        printf("%d ",a[k]);
    return 0;
}