快速排序和归并排序对比
快速排序
排序流程
(1)首先设定一个分界值(一般为第一个元素),通过该分界值将数组分成左右两部分。
(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。
(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
(4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成。
性能分析
O(Nlog2N),不稳定
参考代码
int Partasion(int number[],int left,int right)
{
int piviot=number[left];
while(left<right)
{
while(number[right]>piviot&&left<right)
right--;
if(left<right)
number[left++]=number[right];
while(number[left]<piviot&&left<right)
left++;
if(left<right)
number[right--]=number[left];
}
number[left]=piviot;
return left;
}
void QuickSort(int number[],int left,int right)
{
if(left<right)
{
int piviot=Partasion(number,left,right);
QuickSort(number,left,piviot-1);
QuickSort(number,piviot+1,right);
}
}
归并排序
排序流程
第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置
第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针超出序列尾
将另一序列剩下的所有元素直接复制到合并序列尾
性能分析
O(NlogN),稳定
参考代码
void MergeNumber(int number[],int left,int right)
{
int temp[10];
int i,j,k=left;
int midle=(left+right)>>1;
for(i=0;i<=right;i++)
temp[i]=number[i];
i=left;
j=midle+1;
while(i<=midle&&j<=right)
{
if(temp[i]<temp[j])
number[k++]=temp[i++];
else
number[k++]=temp[j++];
}
while(i<=midle)
number[k++]=temp[i++];
}
void MergeSort(int number[],int left,int right)
{
if(left<right)
{
int midle=(left+right)>>1;
MergeSort(number,left,midle);
MergeSort(number,midle+1,right);
MergeNumber(number,left,right);
}
}