堆排序:
#include <iostream>
using namespace std;
void minHeapFixDown(int a[],int i,int n){
int tmp = a[i];
int j = i*2+1;
while(j<n){
if(j+1<n&&a[j+1]<a[j])
j++;
if(a[i]<=a[j])
break;
swap(a[i],a[j]);
i = j;
j = i*2+1;
}
}
void creatMinHeap(int a[],int n){
for(int i=(n-1)/2;i>=0;i--){
minHeapFixDown(a,i,n);
}
}
int main()
{
int a[10] = {0,8,3,7,5,1,4,6,2,9};
//建立最小堆
creatMinHeap(a,10);
for(int i=0;i<10;i++)
cout<<a[i]<<" ";
cout<<endl;
//每次交换堆顶和当前堆最后一个元素,最终数组变为降序序列
for(int i=9;i>=1;i--){
swap(a[i],a[0]);
minHeapFixDown(a,0,i);
}
for(int i=0;i<10;i++)
cout<<a[i]<<" ";
return 0;
}
快排:
#include <iostream>
using namespace std;
int partition(int a[],int left,int right){
int tmp = a[right];
int i = left-1;
for(int j = left;j<right;j++){
if(a[j]<=tmp){
i++;
if(i!=j)
swap(a[i],a[j]);
}
}
i++;
swap(a[i],a[right]);
return i;
}
void quickSort(int a[],int start,int end){
if(a==NULL||start>end)
return;
int divot = partition(a,start,end);
quickSort(a,start,divot-1);
quickSort(a,divot+1,end);
}
int main()
{
int a[10] = {0,8,3,7,5,1,4,6,2,9};
quickSort(a,0,9);
for(int i=0;i<10;i++)
cout<<a[i]<<" ";
return 0;
}
归并排序:
#include <iostream>
using namespace std;
void mergeCoreSort(int a[],int start,int mid,int end){
int p = mid-start+1;
int q = end -mid;
int left[p];
int right[q];
for(int i=0;i<p;i++)
left[i] = a[start+i];
for(int i=0;i<q;i++)
right[i] = a[mid+i+1];
int i=0;
int j=0;
int k=start;
while(i<p&&j<q){
if(left[i]<=right[j])
a[k++] = left[i++];
else
a[k++] = right[j++];
}
while(i<p)
a[k++] = left[i++];
while(j<q)
a[k++] = right[j++];
}
void mergeSort(int a[],int start,int end){
if(start<end){
int mid = (start+end)/2;
mergeSort(a,start,mid);
mergeSort(a,mid+1,end);
mergeCoreSort(a,start,mid,end);
}
}
int main()
{
int a[10] = {0,8,3,7,5,1,4,6,2,9};
mergeSort(a,0,9);
for(int i=0;i<10;i++)
cout<<a[i]<<" ";
return 0;
}