快速排序算法(6)

本文围绕快速排序算法展开,介绍了其原理,即随机选基准值,将序列分为比基准值小和大的两类。若每次选的基准值能使子序列长度为原本一半,运行时间为O(nlogn),和归并排序类似,分割log2n次后子序列排序完成。

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

目录

快速排序算法原理

快速排序算法的使用场景

快速排序算法的实现

快速排序算法的运行结果


 

快速排序算法原理

      快速排序算法首先会在序列中随机选择一个基准值(pivot),然后将除了基准值以外的数分为“比基准值小的数”和“比基准值大的数”这两个类别,再将其排列成以下形式。分割子序列时需要选择基准值,如果每次选择的基准值都能使得两个子序列的长度为原本的一半,那么快速排序的运行时间和归并排序的一样,都为O(nlogn)。和归并排序类似,将序列对半分割log2n次之后,子序列里便只剩下一个数据,这时子序列的排序也就完成了。因此,如果像下图这样一行行地展现根据基准值分割序列的过程,那么总共会有log2n行分割子序列时需要选择基准值,如果每次选择的基准值都能使得两个子序列的长度为原本的一半,那么快速排序的运行时间和归并排序的一样,都为O(nlogn)。和归并排序类似,将序列对半分割log2n次之后,子序列里便只剩下一个数据,这时子序列的排序也就完成了。因此,如果像下图这样一行行地展现根据基准值分割序列的过程,那么总共会有log2n行。

 

快速排序算法的使用场景

 

快速排序算法的实现

void QuickSort(int *a, int left, int right)
{
	int i = left;
	int j = right;
	int key = a[left];

    if(left >= right)
        return;

	Printf("Sort before:", a, right+1);
	printf("left=%d, right=%d, KeyValue=%d\n", left, right, key);
	printf("\n\n");
     
    while(i < j)  
    {
        while(i < j && key <= a[j])
            j--;
         
        a[i] = a[j];
         
        while(i < j && key >= a[i])
            i++;
         
        a[j] = a[i];
    }
     
    a[i] = key;
    QuickSort(a, left, i-1);
	Printf("Sort after1:", a, right+1);
	printf("\n\n");
    QuickSort(a, i+1, right);
	Printf("Sort after2:", a, right+1);
	printf("\n\n");


}

int main(int argc, char *argv[])
{
	int iArray[] ={10, 23, 65, -101, 10000, 999};
	int *piArryTmp;

	QuickSort(iArray, 0, sizeof(iArray)/sizeof(iArray[0])-1);

	system("pause");
	return 0;
}

快速排序算法的运行结果

Sort before:
10 23 65 -101 10000 999
left=0, right=5, KeyValue=10


Sort after1:
-101 10 65 23 10000 999


Sort before:
-101 10 65 23 10000 999
left=2, right=5, KeyValue=65


Sort after1:
-101 10 23 65 10000 999


Sort before:
-101 10 23 65 10000 999
left=4, right=5, KeyValue=10000


Sort after1:
-101 10 23 65 999 10000


Sort after2:
-101 10 23 65 999 10000


Sort after2:
-101 10 23 65 999 10000


Sort after2:
-101 10 23 65 999 10000


Press any key to continue . . .

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值