快速排序算法最早是由图领奖获得者Tony Hoare设计出来的。希尔排序相当于直接插入排序的升级,同属于插入排序类。堆排序相当于简单选择排序的升级,同属于选择排序类。快速排序是冒泡排序的升级,属于交换类排序,相比较少了总的比较次数和移动交换次数。
快速排序(Quick Sort)的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,已达到整个序列有序的目的。
主要步凑:
1、先从数列中取出一个数做为基准数。
2、分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3、再对左右区间重复第二步,直到各区间只有一个数。
#include<iostream>
using namespace std;
//快速排序
int partition(int* arr,int left,int right); //划分数组区间
int quickSort(int* arr,int left,int right);
void swap(int& elem1,int& elem2);
void test();
void printArr(int* arr,int length);
void swap(int& elem1,int& elem2)
{
int tmp = elem1;
elem1 = elem2;
elem2 = tmp;
}
int partition(int* arr,int left,int right)
{
if(NULL==arr||left<0||right<0||left>right)
return -1;
int tmp = arr[left]; //基准元素
#if 0
while(left<right) //循环结束条件就是 left==right
{
while(left<right&&arr[right]>=tmp)
--right;
swap(arr[left],arr[right]);
while(left<right&&arr[left]<=tmp)
++left;
swap(arr[right],arr[left]);
}
arr[left] = tmp;
#endif
//第二种实现
while(left<right)
{
while(left<right&&arr[right]>=tmp)
--right;
if(left<right) //相等表示已经遍历完毕
arr[left++] = arr[right];
while(left<right&&arr[left]<=tmp)
++left;
if(left<right)
arr[right--] = arr[left];
}
arr[left] = tmp;
return left;
}
int quickSort(int* arr,int left,int right)
{
if(NULL==arr||left<0||right<0||left>right)
return -1;
int pos = partition(arr,left,right);
if(-1==pos)
return -1;
quickSort(arr,left,pos-1);
quickSort(arr,pos+1,right);
return 0;
}
|
void printArr(int* arr,int length)
{
if(NULL==arr||length<=0)
return ;
for(int idx=0;idx!=length;++idx)
{
cout<<arr[idx]<<" ";
}
cout<<endl;
}
void test()
{
int arr[] = {6,5,3,1,8,7,2,4};
printArr(arr,8);
quickSort(arr,0,7);
printArr(arr,8);
cout<<endl;
int arr1[] = {1,2,0,-1,5,6,8,3};
printArr(arr1,8);
quickSort(arr1,0,7);
printArr(arr1,8);
cout<<endl;
int arr2[] = {2,2,2,2};
printArr(arr2,4);
quickSort(arr2,0,3);
printArr(arr2,4);
cout<<endl;
int arr3[] = {2,4,1};
printArr(arr3,3);
quickSort(arr3,0,2);
printArr(arr3,3);
cout<<endl;
int arr5[] = {1,2,3,4,5,6,7,8};
printArr(arr5,8);
quickSort(arr5,0,7);
printArr(arr5,8);
cout<<endl;
int* arr6 = NULL;
printArr(arr6,4);
quickSort(arr6,0,3);
printArr(arr6,4);
cout<<endl;
}
int main()
{
test();
system("pause");
}
|