思路
- partation函数: 将传入的start,end 区间比基准小的放在左边,比基准大的放在右边。
- 可以体会下面代码1 与代码2的区别
- 先挖个坑:文字太难描述,会写一个图文的.
代码1
#include <iostream>
using namespace std;
void swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
int partation(int *arr, int start, int end)
{
if (arr == nullptr || start > end)
throw new invalid_argument("parameters error");
if (start == end)
return start;
int i = start, j = end + 1;
int mark = arr[start];
while (true)
{
while (arr[++i] <= mark)
if (i == end)
break;
while (arr[--j] >= mark)
if (j == start)
break;
if (i >= j)
break;
}
swap(&arr[start], &arr[j]);
return j;
}
void qsort(int *a, int len, int start, int end)
{
if (a == nullptr || len < 2 || start >= end)
return;
int pos = partation(a, start, end);
if (pos > start)
qsort(a, len, start, pos - 1);
if (pos < end)
qsort(a, len, pos + 1, end);
}
int main(int argc, char const *argv[])
{
int len = 6;
int arr[] = {-1, 5,3, 3, 2, -1};
;
qsort(arr, len, 0, len - 1);
for (int i = 0; i < len; i++)
{
cout << arr[i] << " ";
}
cout << endl;
return 0;
}
代码2
#include <iostream>
using namespace std;
void swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
int partation(int arr[] ,int start,int end){
if(arr == nullptr || start>end)
throw new invalid_argument("error");
if(start == end)
return start;
int i=start,j=end+1;
int mark=arr[start];
while(true){
while(i<j&&arr[--j]>=mark) if(j==start) break;
while(i<j&&arr[++i]<=mark) if(i==end) break;
if(i>=j) break;
swap(&arr[i],&arr[j]);
}
swap(&arr[start],&arr[j]);
return j;
}
void qsort(int *a, int len, int start, int end)
{
if (a == nullptr || len < 2 || start >= end)
return;
int pos = partation(a, start, end);
if (pos > start)
{
qsort(a, len, start, pos - 1);
}
if (pos < end)
{
qsort(a, len, pos + 1, end);
}
}
int main(int argc, char const *argv[])
{
int len = 6;
int arr[] = {6,5,4,3,2,1};;
qsort(arr, len, 0, len - 1);
for (int i = 0; i < len; i++)
{
cout << arr[i] << " ";
}
cout << endl;
return 0;
}