这里用到了一个技巧,就是在传入函数参数的时候,在需要排的数据最后放一个最大值,函数里面也让右指针=right+1,这样会省一些时间(函数里的条件left < right一定满足)
打印的时候不打印最后一个元素就好
- 如果没有这个技巧怎么写?
- 没有这个技巧的时候if (left < right)还能这么写吗,好像还可以,但是left>right是怎么跑出来的
- 如何看到程序跑的时间
- 快排的改进?如果有很多相同数据的情况
#include <iostream>
using namespace std;
//快速排序
void QuickSort(int a[], int left, int right){
if (left < right)
{
int i = left;
int j = right+1;
int pivot = a[left];
do{
do i++; while (a[i] < pivot);
do j--; while (a[j] > pivot);
if (i < j) swap(a[i], a[j]);
} while (i<j);
swap(a[left],a[j]);
QuickSort(a,left,j-1);
QuickSort(a,j+1,right);
}
}
int main()
{
int k[] = { 1, 4, 2, 3, 5, 8, 6, 7, 9, 0 ,99};
cout << "before sorting:" << endl;
for (int i = 0; i <10; ++i)
{
cout << k[i] << " ";
}
cout << endl;
QuickSort(k, 0,9);
cout << "after sorting:" << endl;
for (int i = 0; i <10; ++i)
{
cout << k[i] << " ";
}
cout << endl;
system("pause");
return 0;
}
一个比较完整的快速排序,另一个老师讲的,很清楚
有几个点:
-
返回low
-
分-治
-
快速排序是对冒泡排序的改进。 通过一趟排序将要排序的数据分割成独立的两个部分,其中一部分的所有数据比另外一部分的所有数据要小,pivot排在这两个子序列的中间。
无序的元素序列———>无序的子序列1+(pivot)+无序的子序列2 -
之后再按此方法对两部分数据分别进行快排,整个排序过程可以递归进行,以此达到整个数据变成有序数列
#include <iostream>
using namespace std;
int partition(int array[], int low, int high)
{
int pv = array[low];
while (low < high)
{
while ((low < high) && (array[high] >= pv))
{
high--;
}
swap(array[low],array[high]);
while ((low < high) && (array[low] <= pv))
{
low++;
}
swap(array[low], array[high]);
}
return low;
}
void Qsort(int array[], int low, int high)
{
if (low < high)
{
//选一个pv值,把数据分别放在PV值的左右两边,并把pivot位置返回出来
int pivot = partition(array, low, high);
//对子序列1排序
Qsort(array, low, pivot - 1);
//对子序列2排序
Qsort(array, pivot + 1, high);
}
}
void Quicksort(int array[], int len)
{
Qsort(array,0,len-1);
}
int main()
{
int array[] = { 12, 5, 433 ,7,98,32,11,8,2,56};
int len = sizeof(array)/sizeof(*array);
cout << "before sorting:" << endl;
for (int i = 0; i <10; ++i)
{
cout << array[i] << " ";
}
cout << endl;
Quicksort(array, len);
cout << "after sorting:" << endl;
for (int i = 0; i <10; ++i)
{
cout << array[i] << " ";
}
cout << endl;
system("pause");
return 0;
}