堆排序和快速排序 c++
时间: 2023-11-13 17:57:52 浏览: 86
堆排序和快速排序都是常用的排序算法,它们的时间复杂度都为O(nlogn)。但是它们的实现方式不同,堆排序是利用堆这种数据结构来实现的,而快速排序则是利用分治思想来实现的。
堆排序的基本思想是将待排序的序列构建成一个大根堆或小根堆,然后将堆顶元素与堆底元素交换,再将剩余的元素重新构建成一个堆,重复以上步骤直到整个序列有序。
快速排序的基本思想是选取一个基准元素,将序列分成两部分,一部分比基准元素小,一部分比基准元素大,然后对这两部分分别进行快速排序,最终得到有序序列。
下面是堆排序和快速排序的C++代码实现:
堆排序:
void HeapAdjust(int a[], int i, int n) //调整堆
{
int child;
int tmp;
for(tmp=a[i]; 2*i+1<n; i=child)
{
child=2*i+1;
if(child<n-1 && a[child]<a[child+1])
child++;
if(tmp<a[child])
{
a[i]=a[child];
}
else
{
break;
}
}
a[i]=tmp;
}
void HeapSort(int a[], int n) //堆排序
{
int i;
for(i=n/2-1; i>=0; i--)
{
HeapAdjust(a, i, n);
}
for(i=n-1; i>0; i--)
{
swap(a, a[i]);
HeapAdjust(a, 0, i);
}
}
快速排序:
int Partition(int a[], int first,int end) //快速排序的一次划分
{
int i=first;
int j=end;
int tmp;
while(i<j)
{
while(i<j && a[i]<=a[j])
j--;
if(i<j)
{
tmp=a[i];
a[i]=a[j];
a[j]=tmp;
i++;
}
while(i<j && a[i]<=a[j])
i++;
if(i<j)
{
tmp=a[i];
a[i]=a[j];
a[j]=tmp;
j--;
}
}
return i;
}
void QuickSort(int a[],int first,int end) //快速排序
{
int pivot;
if(first<end)
{
pivot=Partition(a,first,end);
QuickSort(a,first,pivot-1);
QuickSort(a,pivot+1,end);
}
}
阅读全文