快速排序
快速排序其实很简单,静下心来看一遍,很快就会了
1.算法思想
(1) 从待排序数组序列中选取一个元素(通常选取第一个元素)为枢纽,设其关键字为x,然后将数组中其余小于x的元素移到前面,将大于或等于x的元素移到后面,将待排序的数组分成了两个子表,将x元素插到其分界线的位置。这个过程称为 一趟快速排序
(2) 经过一次划分后,就以元素x为界,将待排序数组分成了两个子表,而且前子表中的所有元素都小于x,后面子表中的所有元素都大于或等于x,对分割后的子表按照 步骤(1)的方法继续进行分割,直到所有子表的长度不超过1为止。这时待排序的数组就变成了一个有序数组。
2.算法步骤
假设待排序序列为arr[left], arr[left+1], arr[left+2], …, arr[right-1],arr[right]。首先将第一个元素arr[left]移动至变量x中,这时候arr[left]就相当于一个空单元,然后反复进行一下两个操作,直到left和right相遇。
(1) right从右向左扫描,遇到arr[right] < x时,将arr[right]移动至空单元arr[left]中,此时arr[right]相当于一个空单元。
(2) left从左向右扫描,直到arr[left] > x时,将arr[left]移动至空单元arr[right]中此,时arr[left]就相当于一个空单元。
循环执行以上操作,直到left和right相遇时,arr[left] (或arr[right])就相当于一个空单元,并且arr[left]左边的所有元素都小于x,右边的所有元素都大于或等于x,最后将x放入arr[left]中,就完成了一次划分过程。接下来对左右两边的子表使用相同的办法进行进一步划分。
3.算法实现
void Quick(int arr[], int left, int right, int n)//完整的快速排序算法
{
int ret;
if (left < right)
{
ret = Quick_sorting(arr, left, right);//ret为两个子表分界点
Quick(arr, left, ret - 1, n);
Quick(arr, ret+1, right, n);
}
}
int Quick_sorting(int arr[], int left, int right)//一趟快速排序算法
{
int x = arr[left];
while (left < right)
{
while (left < right && arr[right] >= x)
{
right--;
}
if (left < right)
{
arr[left] = arr[right];
left++;
}
while (left< right && arr[left] < x)
{
left++;
}
if (left < right)
{
arr[right] = arr[left];
right--;
}
}
arr[left] = x;
return left;
}
keep going on!