快速排序

快速排序 - QSort


第一种Partition的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
int (int* data, int length, int start, int end)
{
if (data == nullptr || length <= 0 || start < 0 || end >= length)
return -1;

int small = start - 1;
for (int index = start; index < end; index++)
{
if (data[index] < data[end])
{
small++;
if (small != index)
swap(data[index], data[small]);
}
}
small++;
swap(data[small], data[end]);
return small;
}
void Qsort(int* data, int length, int start, int end)
{
if (start == end)
return;
int index = Partition(data, length, start, end);
if (index > start)
Qsort(data, length, start, index - 1);
if (index < end)
Qsort(data, length, index + 1, end);
}

第二种Partition的方法(更容易理解)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int myPartition(int* data, int length, int start, int end)
{
int left = start, right = end - 1;
while (left < right)
{
while (data[left] < data[end] && left < right)
left++;
while (data[right] >= data[end] && left < right)
right--;
swap(data[left], data[right]);
}
if (data[left] >= data[end])
swap(data[left], data[end]);
else
swap(data[++left], data[end]);
return left;
}
void myQsort(int* data, int length, int start, int end)
{
if (data == nullptr || length <= 0 || start >= end)
return;
int index = myPartition(data, length, start, end);
myQsort(data, length, start, index - 1);
myQsort(data, length, index + 1, end);
}