快速排序在众多排序正如它的名字一样,速度是比较快的相对于其他的排序
快速排序的基本思想是:
从数据中取一个数作为基数,一般我们在选基数的时候,最好选最左边或最右边的数,同时从左边和右边同时遍历数组,如果要排升序,从右边往左边遍历的找小于基数的数,从左边往右边遍历的找大于基数的值,然后两个位置就互换,从而就把大的往右边甩,小的往左边甩,于是就完成了单趟的快速排序,其平均的时间复杂度为O(nlog n)
int GetMid(int*a, int left, int right)//为了避免去最小的值做为基数,所以写了一个取中函数
{
int mid = (left -right)/2;//取中间的数
if (a[left] < a[mid])
{
if (a[mid] < a[right])
{
return mid;
}
else if (a[left]>a[right])
{
return left;
}
else
{
return right;
}
}
else
{
if (a[left] < a[right])
{
return left;
}
else if (a[mid] > a[right])
{
return mid;
}
else
{
return right;
}
}
}
int PartQulickSort1(int*a, int left, int right)
{
int mid = GetMid(a, left, right);//取中
Swap(&a[mid], &a[left]);//将中间的数与最左右的数交换下//swap写的交换函数
int keyi = left;//得到基数的位置
while (left < right)
{
while (left<right&&a[right] >= a[keyi])//先从右边找到较小的值
{
right--;
}
while (left<right&&a[left] <= a[keyi])//再从左边找最大的值
{
left++;
}
Swap(&a[right], &a[left]);//进行交换
}
Swap(&a[right], &a[keyi]);//最后将right或者left位置的值与基数交换
return right;
}
int main()
{
int a[] = { 6, 3, 21, 5, 3, 2, 65, 32, 11, 3, 76 };
int sz = sizeof(a) / sizeof(a[1]);
PartQulickSort2(a, 0, sz - 1);
PrintSortArry(a, sz - 1);
//PrintSortArry(a, sz - 1);
//QulickSort(a, 0, sz - 1);
//PrintSortArry(a, sz - 1);
return 0;
}
第一次排序后,大于6的都在右边,小于6的都在左边。最后用递归的方法·将整个数组进行排序。
void QulickSort(int*a, int left, int right)
{
if (left >= right)//排序的终止条件
{
return;
}
int mid = PartQulickSort2(a,left,right);//先进行第一趟排序,去除中间值
QulickSort(a, left, mid-1);//然后在排序左边的数组
QulickSort(a, mid + 1, right);//最后排序右边的数组
}
int main()
{
int a[] = { 6, 3, 21, 5, 3, 2, 65, 32, 11, 3, 76 };
int sz = sizeof(a) / sizeof(a[1]);
PartQulickSort2(a, 0, sz - 1);
PrintSortArry(a, sz - 1);
QulickSort(a, 0, sz - 1);
PrintSortArry(a, sz - 1);
return 0;
}