快速排序
原理:确定一个元素 使得该元素左侧全部小于该元素 右侧元素全部大于该元素。(递归)
时间复杂度:平均(O(nlogn))
最坏O(n^2)(总是选A[left]做主元)
解决办法:
生成随机数,swap(A[p],A[left]) 注意交换函数的写法,需要提供指针以交换地址。
头文件cstdlib ctime
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
using namespace std;
Swap(int *a,int i,int j)
{
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
int Partition(int A[],int left,int right) //划分
{
int temp=A[left];
while(left<right&&A[right]>temp)
{
right--;
}
A[left]= A[right];
while(left<right&&A[left]<temp)
{
left++;
}
A[right]=A[left];
A[left]=temp;
return left;//返回相遇的下标
}
//提高效率用randPartition
int randPartition(int A[],int left,int right) //划分
{
int p=(rand()/RAND_MAX*(right-left)+left); //生成随机数
Swap(A,p,left);
int temp=A[left];
while(left<right&&A[right]>temp)
{
right--;
}
A[left]= A[right];
while(left<right&&A[left]<temp)
{
left++;
}
A[right]=A[left];
A[left]=temp;
return left;//返回相遇的下标
}
void quickSort(int A[],int left,int right)
{
if(left<right)
{
int pos=Partition(A,left,right);
quickSort(A,left,pos-1);
quickSort(A,pos+1,right);
}
}
int main()
{
int A[12]={0,35,18,16,72,24,65,12,88,46,28,55};
//printf("%d\n",Partition(A,1,11) );
randPartition(A,1,11);
quickSort(A,1,11);
for(int i=1;i<=11;i++)
{
printf("%d ",A[i]);
}
return 0;
}