https://www.cnblogs.com/dplearning/p/4655264.html
方法一:不断填坑,一次确定一个值。http://blog.csdn.net/morewindows/article/details/6684558
#include<stdio.h>
void qsort(int *array, int len)
{
int value, start, end;
if (len <= 1)
return;
value = array[0];
start = 0;
end = len - 1;
while (start < end) {
for (; start < end; --end) {
if (array[end] < value) {
array[start++]=array[end];
break;
}
}
for (; start < end; ++start) {
if (array[start] > value)
{
array[end--]=array[start];
break;
}
}
}
array[start]=value;
qsort(array, start );
qsort(array+start+1 , len-start-1 );
}
int main()
{
int a[10]={9,8,7,3,4,5,6,1,2,0};
qsort(a,10);
int i;
for(i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
}
方法二:一次找到两个值交换 http://developer.51cto.com/art/201403/430986.htm
#include <stdio.h>
int a[101],n;//定义全局变量,这两个变量需要在子函数中使用
void quicksort(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;
quicksort(left,i-1);//继续处理左边的,这里是一个递归的过程
quicksort(i+1,right);//继续处理右边的 ,这里是一个递归的过程
}
int main()
{
int i,j,t;
//读入数据
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
quicksort(1,n); //快速排序调用
//输出排序后的结果
for(i=1;i<=n;i++)
printf("%d ",a[i]);
getchar();getchar();
return 0;
}
这两段代码已经创建了vs工程,用随机数,来测试两种方法的效率。quickSort
#pragma once
#pragma execution_caracter_set("utf-8")
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//https://blog.csdn.net/morewindows/article/details/6684558
//https://www.cnblogs.com/dplearning/p/4655264.html
//快速排序,思路一:挖坑填数+分治法
void quicksort1(int *array, int len)
{
int value, start, end;
if (len <= 1)
return;
value = array[0];
start = 0;
end = len - 1;
while (start < end) {
for (; start < end; --end) {
if (array[end] < value) {
array[start++] = array[end];
break;
}
}
for (; start < end; ++start) {
if (array[start] > value)
{
array[end--] = array[start];
break;
}
}
}
array[start] = value;
quicksort1(array, start);
quicksort1(array + start + 1, len - start - 1);
}
void quicksort2(int *array, int left, int right)
{
int i, j, t, temp;
if (left>right)
return;
temp = array[left]; //temp中存的就是基准数
i = left;
j = right;
while (i != j)
{
//顺序很重要,要先从右边开始找
while (array[j] >= temp && i<j)
j--;
//再找右边的
while (array[i] <= temp && i<j)
i++;
//交换两个数在数组中的位置
if (i<j)
{
t = array[i];
array[i] = array[j];
array[j] = t;
}
}
//最终将基准数归位
array[left] = array[i];
array[i] = temp;
quicksort2(array, left, i - 1);//继续处理左边的,这里是一个递归的过程
quicksort2(array, i + 1, right);//继续处理右边的 ,这里是一个递归的过程
}
int main()
{
//int a[10] = { 9, 8, 7, 3, 4, 5, 6, 1, 2, 0 };
clock_t start, end;
//产生一个随机数数组
int a[200000];
int i;
for (i = 0; i < 200000; i++)
{
a[i] = rand() % 100000;
}
//快速排序方法1
#if 1
start = clock();
quicksort1(a, 200000);
end = clock();
printf("total time1=%f ms\n", (float)(end - start) * 1000 / CLOCKS_PER_SEC);
//打印
for (i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
#else
//快速排序方法2
start = clock();
quicksort2(a, 0, 100000-1); //快速排序调用
end = clock();
printf("total time2=%f ms\n", (float)(end - start) * 1000 / CLOCKS_PER_SEC);
//打印
for (i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
#endif
getchar();
}