快速排序(Quick Sort)

本文详细介绍了快速排序算法,包括其基本思想、算法描述及实现过程,并提供了C语言实现代码示例。此外,还介绍了一种改进版快速排序算法,通过限制递归深度并结合插入排序,进一步提高了排序效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

6.快速排序(Quick Sort)

快速排序的名字起的是简单粗暴,因为一听到这个名字你就知道它存在的意义,就是快,而且效率高! 它是处理大数据最快的排序算法之一了。

(1)算法简介

快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

(2)算法描述和实现

快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:

<1>.从数列中挑出一个元素,称为 "基准"(pivot);

<2>.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;

<3>.递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

(3)算法分析

最佳情况:T(n) = O(nlogn);最差情况:T(n) = O(n2);平均情况:T(n) = O(nlogn)

#include<stdio.h>

void swap(int *x, int *y){

    int tmp = *x;

    *x = *y;

    *y = tmp;  }

//分治法把数组分成两份

int patition(int *a, int left,int right) {

    int j = left;    //用来遍历数组

    int i = j - 1;    //用来指向小于基准元素的位置

    int key = a[right];    //基准元素

    //从左到右遍历数组,把小于等于基准元素的放到左边,大于基准元素的放到右边

    for (; j < right; ++j) {    if (a[j] <= key)  swap(&a[j], &a[++i]);   }

    //把基准元素放到中间

    swap(&a[right], &a[++i]);

    //返回数组中间位置

    return i;

}

//快速排序

void quickSort(int *a,int left,int right) {

    if (left>=right)      return;

    int mid = patition(a,left,right);

    quickSort(a, left, mid - 1);

    quickSort(a, mid + 1, right);

}

int main() {

    int a[] = { 10,6,5,7,12,8,1,3,11,4,2,9,16,13,15,14 };

    int n = sizeof(a) / sizeof(int);

    quickSort(a, 0,n-1);

    printf("排序好的数组为:");

    for (int l = 0; l < n; l++) {

        printf("%d ", a[l]);

    }

    printf("\n");

    return 0;

}



/快速排序 在本改进算法中,只对长度大于k的子序列递归调用快速排序,让原序列基本有序,然后再对整个基本有序序列用插入排序算法排序。实践证明,改进后的算法时间复杂度有所降低,且当k取值为 8 左右时,改进算法的性能最佳。算法思想如下:

 

void print(int a[], int n){

for(int j= 0; j<n; j++){ cout<<a[j] <<"  "; }

cout<<endl;  }

void swap(int *a, int *b)

{  int tmp = *a;    *a = *b;  *b = tmp;    }

int partition(int a[], int low, int high)

{  int privotKey = a[low]; //基准元素

while(low < high){ //从表的两端交替地向中间扫描

while(low < high  && a[high] >= privotKey) --high; //high 所指位置向前搜索,至多到low+1 位置。将比基准元素小的交换到低端

swap(&a[low], &a[high]);

while(low < high  && a[low] <= privotKey ) ++low;

swap(&a[low], &a[high]);

}

print(a,10);

return low;

}

void qsort_improve(int r[ ],int low,int high, int k){

if( high -low > k ) { //长度大于k时递归, k为指定的数

int pivot = partition(r, low, high); // 调用的Partition算法保持不变

qsort_improve(r, low, pivot - 1,k);

qsort_improve(r, pivot + 1, high,k);

}

}

void quickSort(int r[], int n, int k){

qsort_improve(r,0,n,k);//先调用改进算法Qsort使之基本有序

//再用插入排序对基本有序序列排序

for(int i=1; i<=n;i ++){

int tmp = r[i];

int j=i-1;

while(tmp < r[j]){

r[j+1]=r[j]; j=j-1;

}

r[j+1] = tmp;

}

}

int main(){

int a[10] = {3,1,5,7,2,4,9,6,10,8};

cout<<"初始值:";

print(a,10);

quickSort(a,9,4);

cout<<"结果:";

print(a,10);

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值