快速排序的基本思想是基于分治法的,在待排序表中任选一个基准元素,通过一趟排序将待排序划分为独立的两部分,前半部分所有元素均比枢轴元素小,后半部分所有元素均比枢轴元素大,此时枢轴元素就放在了最终的位置,然后分别对两个字表递归重复上面的过程,直至每部分内只有一个元素或空为止,即所有元素放在了其最终位置上。
快速排序比冒泡排序优良的地方在于它的每次比较不是相邻元素的一次一次比较,而分别从两端开始”探测”的,先从右往左找一个小于枢轴元素的数,放到枢轴的左边,再从左往右找一个大于枢轴的数,放在枢轴的右边。
#include <stdio.h>
#include <windows.h>
#include <stdint.h>
void Quick_sort(int a[],int low,int high);
int Partition(int a[],int low,int high);
int main()
{
int k;
int num[9]={9,8,7,4,6,5,1,2,3};
int sortsize=sizeof(num)/sizeof(num[0]);
Quick_sort(num,0,sortsize);
for(k=0;k<sortsize;k++)
printf("\n%d",num[k]);
system("pause");
return 0;
}
void Quick_sort(int a[],int low,int high)
{
if(low<high)
{
int pivotpos=Partition(a,low,high);
Quick_sort(a,low,pivotpos-1);
Quick_sort(a,pivotpos+1,high);
}
}
int Partition(int a[],int low,int high)
{
int i,j;
int temporary;
temporary=a[low];
while(low<high)
{
while(low<high&&a[high]<temporary)
high--;
a[low]=a[high];
while(low<high&&a[low]>temporary)
low++;
a[high]=a[low];
}
a[low]=temporary;
return low;
}
快速排序的效率相对而言比较优良,空间复杂度最好情况下为O(log2n),最坏情况下,因为要进行n-1次递归调用,所以为O(n),平均情况下,大致为O(log2n)。 快速排序的运行时间与划分是否对称有关,快速排序的最坏情况发生在两个区域分别包含n-1个元素和0个元素时,这种最大限度的不对称性若发生在每层递归上,即对应于初始排序表基本有序或者基本逆序时,就得到最坏情况下的时间复杂度O(n^2)。理想情况下,时间复杂度为O(nlog2n)。快速排序是所有内部排序算法中平均性能最优的排序算法。是一种不稳定的排序方法。 在快速排序算法中,并不产生有序子序列,但每趟排序后会将枢轴元素放在其最终的位置上。