/*
恩,重头戏开始了,快速排序是各种笔试面试最爱考的排序算法之一,
且排序思想在很多算法题里面被广泛使用。是需要重点掌握的排序算法。
其基本思想是基本思想是,通过一趟排序将待排记录分隔成独立的两部分,
其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分
记录继续进行排序,以达到整个序列有序。
1、从数列中挑出一个元素,称为 "基准"(pivot),
2、重新排序数列,所有元素比基准值小的摆放在基准前面,
所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。
在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
3、递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
下面是随机数作为基准的版本
//使用引用,完成两数交换
void Swap(int& a , int& b)
{
int temp = a;
a = b;
b = temp;
}
//取区间内随机数的函数
int Rand(int low, int high)
{
int size = hgh - low + 1;
return low + rand()%size;
}
//快排的partition算法,这里的基准数是随机选取的
int RandPartition(int* data, int low , int high)
{
swap(data[rand(low,high)], data[low]);//
int key = data[low];
int i = low;
for(int j=low+1; j<=high; j++)
{
if(data[j]<=key)
{
i = i+1;
swap(data[i], data[j]);
}
}
swap(data[i],data[low]);
return i;
}
//递归完成快速排序
void QuickSort(int* data, int low, int high)
{
if(low<high)
{
int k = RandPartition(data,low,high);
QuickSort(data,low,k-1);
QuickSort(data,k+1,high);
}
}
*/
#include<stdio.h>
int index = 1;
void print(int *a){
int i;
for(i = 0; i < 7;i++){
printf("%d ",a[i]);
}
printf("%d\n",a[i]);
}
void quickSort(int *a,int left,int right){
int i,j,pivot;
if(left < right){
i = left;
j = right; //i,j左右边界赋值
pivot = a[i]; //准备以本次最左边的元素值为标准进行划分,先保存其值
while(i != j){ //我们知道快排是把左边界增大 右边界减小 相遇的时候则排序一趟完毕
while(a[j] > pivot && i<j )//从右向左找第1个小于标准值的位置j
j--;
if(i<j){ //找到了,位置为j
a[i] = a[j]; //将第j个元素置于左端并重置i i++
i++;
}
while(a[i] < pivot && i<j)
i++; //从左向右找第1个大于标准值的位置i
if(i<j){ //找到了,位置为i
a[j] = a[i]; //将第i个元素置于右端并重置j j--
j--;
}
}
a[i] = pivot; //将标准值放入它的最终位置,本次划分结束
printf("第 %d 趟排序:",index++);
print(a);
quickSort(a, left, i-1); //对标准值左半部递归调用本函数
quickSort(a, i+1, right); //对标准值右半部递归调用本函数
}
} //排序出了点问题
//正常的基准
int main(){
int left,right;//左右边界下标 int值基准
int a[8] ={45, 95, 15, 78, 84, 51, 24, 12};
left = 0;
right = 7;
printf("原序列:");
print(a);
quickSort(a,left,right);
printf("排序后元素如下:");
print(a);
return 0;
}
快速排序
最新推荐文章于 2024-10-09 09:53:23 发布