快速排序算法总结 简单易懂

**

快速排序算法

**

文章目录

  • 快速排序算法
  • 一、基本概念
  • 二、思路步骤
  • 三、编写代码
    • 1.快速排序
    • 2.完整代码
  • 四、运算结果
  • 五、总结评价


一、基本概念

快速排序是由冒泡排序改进而得。在冒泡排序中,只对相邻的两个记录进行比较,所以每次只能消除一个逆序。而快速排序一次交换可以消除多个逆序,会大大提升排序的速度。

快速排序算法总结 简单易懂_第1张图片

二、思路步骤

  1. 对于一组记录arr[]我们将最左边的值设为基准值key,两个哨兵i,j分别在最左边和最右边
  2. 分别移动哨兵i至一个记录的值比基准值大,哨兵j移动至一个记录的值比基准值小,并将两个记录的位置进行交换
  3. 重复步骤2,直至哨兵i和哨兵j擦肩而过,即哨兵i移动到哨兵j后面(或者说哨兵j移动到哨兵i前面)
  4. 将基准值的位置与哨兵j所在位置的记录交换位置
  5. 以基准值为界将记录分成两部分,分别进行排序
  6. 重复步骤5,直至每部分只有一个元素

三、编写代码

1.快速排序

void QuickSort(int *arr,int left,int right)//快速排序
{
    //结束条件,即仅剩一个元素
    if(left==right) return;

    int i,j,key;
    //前后两个哨兵
    i=left-1;
    j=right+1;
    //基准值
    key=arr[left];
    while(i<j)
    {
        while(arr[++i]<key);
        while(arr[--j]>key);
        if(i<j) Swap(&arr[i],&arr[j]);
    }
    //将key值与最后一个数交换,保证key之前都是比key小的,key后面都是比key大的
    Swap(&arr[j],&arr[left]);

    //将序列分成两部分,分别排序
    QuickSort(arr,left,j);
    QuickSort(arr,j+1,right);
}

2.完整代码

#include 

void Swap(int *a,int *b)//交换
{
    int temp;
    temp=*a;
    *a=*b;
    *b=temp;
}

void QuickSort(int *arr,int left,int right)//快速排序
{
    //结束条件,即仅剩一个元素
    if(left==right) return;

    int i,j,key;
    //前后两个哨兵
    i=left-1;
    j=right+1;
    //基准值
    key=arr[left];
    while(i<j)
    {
        while(arr[++i]<key);
        while(arr[--j]>key);
        if(i<j) Swap(&arr[i],&arr[j]);
    }
    //将key值与最后一个数交换,保证key之前都是比key小的,key后面都是比key大的
    Swap(&arr[j],&arr[left]);

    //将序列分成两部分,分别排序
    QuickSort(arr,left,j);
    QuickSort(arr,j+1,right);
}

int main()
{
    int i,len;
	int testArr[]={10,9,1,4,13,6,7,9,2};//测试数组
    len=sizeof(testArr)/sizeof(testArr[0]);//求数组长度

    //进行排序
	QuickSort(testArr,0,len-1);
    //输出打印
	for(i=0;i<len;i++) printf("%d ",testArr[i]);

	return 0;
}

四、运算结果

在这里插入图片描述


五、总结评价

  1. 时间复杂度,在平均情况下,O(nlog2n)
  2. 空间复杂度,最好情况下为O(log2n),最坏情况下为O(n)
  3. 算法特点如下:
  • 记录非顺次移动导致排序方法时不稳定的
  • 适用于顺序结构,很难用于链式结构
  • n较大时,平均情况下,快速排序方法速度最快,适用于初始记录无序,n较大时的情况

有问题欢迎各位大佬指出
算法系列将持续更新,欢迎关注,一起学习

你可能感兴趣的:(算法,排序算法,算法,数据结构)