快速排序算法的关键在于先在数组中选择一个数,接下来把数组中的数字分为两部分,比选择的数字小的数移动到左边,比选择的数字大的在右边--<<剑指offer>>
1.第一次直接写的快速排序算法,太稚嫩了hhhh
void QuestSore1(int arr[], int l, int r)
{
if (arr == nullptr)
return;
int left = l;//左值
int right = r;//右值
int base = arr[left]; //基准数为最左
bool move_right = true;//判断是移动left还是移动right
while (left < right)
{
if (move_right)
{
if (arr[right] < base)
{
arr[left] = arr[right];
left = left + 1;//移动left
move_right = false;//下一次判断left
}
else
{
right--;
move_right = true;
}
}
else
{
if (arr[left] < base)
{
left++;
move_right = false;
}
else
{
arr[right] = arr[left];
right--;
move_right = true;
}
}
}
arr[left] = base;
if (left - l >= 1)
{
QuestSore1(arr, 1, left - 1);
}
if (r - right >= 1)
{
QuestSore1(arr, right + 1, r);
}
}
2.以最左边的数为基准,从前往后遍历比较.
void swap(int &a,int &b)
{
int temp=a;
a=b;
b=temp
}
int division(int number[],int left,int right)
{
int base=left;
int basevalue=number[left];
while (left < right)
{
while (left<right && numbers[right]>= basevalue)//寻找小于base的数
right--;
while (left < right && numbers[left] <= basevalue)//寻找大于base的数
left++;
if (left < right)//如果不小于则说明是要出循环与arr[base]交换
swap(numbers[left], numbers[right]);
}
swap(numbers[base], numbers[left]);
return left;
}
void QuickSort(int *numbers, int left, int right)
{
if (left < right)
{
int pivot = division(numbers, left, right);//找到中心位置
if(pivotloc-1-left>=1)
QuickSort(numbers, left, pivot - 1);
if (right-pivotloc -1 >= 1)
QuickSort(numbers, pivot + 1,right);
}
}
3.在<<剑指offer>>中所看到的,RandomInRange()函数将随机选取一个数,从前往后遍历,每遍历到一个新元素,先进行甄别,属于小于枢纽元的话,把他交给数组的left部分,否则right部分。具体如何交给left呢?那就是先让left增加,这个时候left部分会持有一个不属于它的元素(大于等于pivot),这时候把这个元素和才遍历到的元素交换就行了,而如果这个元素本来就属于right部分,则不用做任何处理。
参考:快速排序 一次遍历partition的实现_zdy0_2004的博客-CSDN博客
int RandomInRange(int start,int end)
{
int random = rand() % (end - start + 1) + start;
return random;
}
void swap(int &a, int &b)//交换
{
int temp = a;
a = b;
b = temp;
}
int Partition(int data[], int length, int start, int end)//该函数的功能是使取的数的左边都比选择的数字小,右边都比该函数大
{
if (data == nullptr || length <= 0 || start < 0 || end >= length)
throw new std::exception("Invalid Parameters");
int index = RandomInRange(start, end);
swap(data[index], data[end]);//保存在最后面,因为必须从start遍历到end,存储选中的数字必须位于最左或者最右
int small = start - 1;//这个是要交换的数字,有点相当于左指针的那个意思(大概)
for (index = start; index < end; index++)//开始从前往后遍历
{
if (data[index] < data[end])//小于的话,要放在
{
small++;
if (index != small)//不能等于,如果等于的话就说明没有一个大于选择中的数,不能交换
swap(data[index], data[small]);
}
}
small++;//要大于选中的数,交换后放在选择的数的右边
swap(data[small], data[end]);//把选择的数放在应该放的位置
return small;
}
void QuickSort(int data[], int length, int start, int end)
{
if (start == end)
return;
int index = Partition(data, length, start, end);
if (index>start)
QuickSort(data, length, start, index - 1);
if (index < end)
QuickSort(data, length, index + 1, end);
}