基本思想:与归并排序一样,快速排序也采用了分治法。将原问题分解成几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后再合并这些子问题的解来建立原问题的解。在快速排序中,因为子数组都是原址排序的,所以不需要合并操作。
第一轮交换
选定基准元素为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 |
排序整体流程
算法如下
----------
/*排序算法:快速排序
时 间: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;
}