Quick_sort快速排序
Posted 超浪*牛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Quick_sort快速排序相关的知识,希望对你有一定的参考价值。
快速排序(交换排序)
按照之前学过的冒泡排序,我们知道它的时间复杂度达到了O(n的2次方);那如果是对1亿个数字进行排序,则这个冒泡排序法需要1千万秒,达到115天之久,那么有没有更加快一点的排序呢?那就先来了解一下这个与冒泡类似的交换排序吧!
- 假设现在对“6、1、2、7、9、3、4、5、10、8”这10个数字排序。
- 首先在这个序列中找到一个数作为基准数(可不要被这个名词吓到,这就是用来参照的一个数,待会呢,你就知道它是用来干嘛的了)
首先我们需要在数列中选择一个基准数,我们一般会选择中间的一个数或者头尾的数,这里直接选择第 1 个数 6 作为基准数,接着把比 6 小的数字移动到左边,把比 6大的数字移动到右边,对于相等的数字不做移动。
快速排序的操作是这样的:从数据的两端开始探测,首先从数列的右边开始往左边找到一个小于6的数,再从右往左找一个大于6的数然后交换他们(切记一定先是从右往左找)直到二者相遇时,回归基数。
代码描述如下:
/***********************************************************
*版权所有:(C) 2021.6.10 烽火编程(第八方面军)
*
*文件名称:quick_sotr
*内容摘要:排序算法
*当前版本:1——1
*文件作者:牛鹏
*完成日期:2021.6.10
*
*修改记录:暂无
***********************************************************/
#include <stdio.h>
#include <stdlib.h>
int Quick_Sort(int a[],int left,int right){
int i,j,t,temp;
if(left>right){
return;
}
temp = a[left];//temp存放的就是基准数
i = left;
j = right;
while(i!=j){
//顺序很重要,要先从右往左找,(找小)
while(a[j]>=temp && i<j){
j--;
}
//在从左往右找,(找大)
while(a[i]<=temp && i<j){
i++;
}
//在两个下标未遇之前,交换两个数在数组中的位置
if(i<j){
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
//最终将基数归位
a[left] = a[i];
a[i] = temp;
Quick_Sort(a,left,i-1);//继续处理左边部分 ,递归过程
Quick_Sort(a,i+1,right);//继续处理右边部分,递归过程
}
int main() {
int a[] = {6,1,2,7,9,3,4,5,10,8};
int i;
for(i=0;i<10;i++){
printf("%d ",a[i]);
}
Quick_Sort(a,0,9);
printf("\\n排序后↓:\\n");
for(i=0;i<10;i++){
printf("%d ",a[i]);
}
return 0;
}
以上是关于Quick_sort快速排序的主要内容,如果未能解决你的问题,请参考以下文章