// 数据结构_快速排序.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
/*快速排序跟合并排序类似,也是采用分治法进行,但是它是一种就地排序,所以又略有不同
因为两个数组已经是排好序了,将他们合并不需要操作,整个数组已排序
它的时间复杂度为N*lgN*/
/*算法导论中的伪代码
QUICKSORT(A,p,r)
1 if p < r
2 then q <- PARTITION(A,p,r)
3 QUICKSORT(A,p,q-1)
4 QUICKSORT(A,q+1,r)
5 MERGE(A,p,q,r)
PARTITION(A,p,r)
1 x <- A[r]
2 i <- p - 1
3 for j <- p to r-1
4 do if A[j] <= x
5 then i <- i + 1
6 exchange A[i] <-> A[j]
7 exchange A[i+1] <-> A[r]
8 return i+1
*/
#define array_length 100
int paixu_partion(int a[],int p,int r){
int x = 0,i = 0,j = 0;
int temp = 0;
i = p - 1;
/*将最后一个元素设置为区分量的两个数组
前面一个数助的下标用i表示,后面一个用j表示*/
x = a[r];
for(j = p;j < r;j++){
/*首先将j++,
如果小于最后的一个元素,将i++
把i和j的元素进行互换*/
if(a[j] <= x)
{
i = i + 1;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
else{
/*如果是大于最后的一个元素,将此元素和最后的一个元素进行交换*/
temp = a[i+1];
a[i+1] = a[r];
a[r] = temp;
}
}
return i+1;
}
int paixu_sort(int a[],int p,int r)
{
if(p < r){
int q = paixu_partion(a,p,r);
paixu_sort(a,p,q-1);
paixu_sort(a,q+1,r);
}
return 0;
}
int main(int argc, char* argv[])
{
int a[array_length];
int i = 0,j = 0;
printf("快速排序前数据\n");
for(i = 0; i < array_length; i++){
a[i] = rand()*3+rand()/2 + 123;
printf("%d ",a[i]);
}
printf("\n");
paixu_sort(a,0,array_length-1);
printf("快速排序后数据\n");
for(i = 0; i < array_length; i++){
printf("%d ",a[i]);
}
printf("\n");
return 0;
}