大家好,众所周知,快排是世界上最优秀的排序算法之一,那么今天我来教大家快排。
快排的时间复杂度O(nlog2n),最坏的情况是O(n2),最好的情况是O(nlog2n)。
那我来讲一下思路,首先你找个基准数,一般选用数组第一个数,然后从右边开始移动,等有了比基准数tmp小的数之后,j停止移动,然后i移动,等有了大于tmp的数之后,二者交换,然后j继续,以此类推,最后用递归。
且看下面的图:
详细看代码注释:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
void qsort(int a[],int low,int high)//low代表找一个基点,然后其他数与其相比
{
int i,j;
int tmp,t;//tmp是基准数,t是后面交换需要的
i = low;
j = high;
tmp = a[low];
if(i>j){//整个函数结束条件
return;
}
while(i!=j)//大条件,每次整体交换完停止,后面再用那个递归
{
//首先从右边开始移动,然后找到小于a[i ]则停止,然后移动i,重复此步,直到i==j;
while(a[j]>=tmp&&j>i){
j--;
}
while(a[i]<=tmp&&j>i){
i++;
}
if(j>i){//两数交换位置
t = a[j];
a[j] = a[i];
a[i] = t;
}
}
//在交互二者汇合地和a[low]的值,即基准点的值
a[low] = a[i];
a[i] = tmp;
//递归
qsort(a,low,i-1);
qsort(a,i+1,high);
}
int main()
{
int num[999]={0};
int i;
int n;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&num[i]);
}
qsort(num,0,n-1);
for(i=0;i<n;i++){
printf("%d ",num[i]);
}
return 0;
}
下面是java版本:
import java.util.*;
public class Quicksort {
public static void myquickSort(int[] arr,int low,int high){
int i,j,temp,t;
if(low>high){
return;
}
i=low;
j=high;
//temp就是基准位
temp = arr[low];
while (i<j) {
//先看右边,依次往左递减
while (temp<=arr[j]&&i<j) {
j--;
}
//再看左边,依次往右递增
while (temp>=arr[i]&&i<j) {
i++;
}
//如果满足条件则交换
if (i<j) {
t = arr[j];
arr[j] = arr[i];
arr[i] = t;
}
}
//最后将基准为与i和j相等位置的数字交换
arr[low] = arr[i];
arr[i] = temp;
//递归调用左半数组
myquickSort(arr, low, j-1);
//递归调用右半数组
myquickSort(arr, j+1, high);
}
public static void main(String[] args){
int[]arr = {10,7,2,4,7,62,3,4,2,1,8,9,19};
myquickSort(arr, 0, arr.length-1);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
okokok,今天的学习到此为止,加油奥利给;
但是快排虽好,也有缺点;
关注我,带你学会更多排序方法;