快速排序
[快速排序的基本思想] 设数组a中存放了n个数据元素,low为数组的低端下标,high为数组的高端下标,从数组a中任取一个元素(通常取a[low])作为标准,调整数组a中各个元素的位置,使排在标准元素前面的元素的关键字均小于标准元素的关键字,排在标准元素后面的元素的关键字均大于或等于标准元素的关键字。这样一次过程结束后,一方面将标准元素放在未来排好序的数组中该标准元素应在的位置,另一方面将数组中的元素以标准元素为中心分成两个子数组,位于标准元素左边子数组中的元素关键字均小于标准元素的关键字,右边同理,对两个子数组中的元素分别再使用相同的方法递归快速排序
代码如下:
#define DateType 你想要的数据类型
typedef struct
{
KeyType key;
}DateType
void QuickSort(DateType a[],int low,int high)
{
int i=low,j=high;
DateType temp=a[low]; //取第一个数据元素为标准数据元素
while(i<j)
{
while(i<j&&temp.key<=a[i].key) //在数组的右端扫描
j--;
if(i<j)
{
a[i]=a[j];
i++;
}
while(i<j&&a[i].key<temp.key) //在数组的左端扫描
i++;
if(i<j)
{
a[j]=a[i];
j--;
}
}
a[i]=temp;
if(low<i)
QuickSort(a,low,i-1); //对左端子集合进行递归
if(i<high)
QuickSort(a,j+1,high); //对右端子集合进行递归
}
最坏情况下快速排序算法的空间复杂度为O(n),时间复杂度为O(n²)
平均情况下时间复杂度为O(nlbn)