1.归并排序
#include <iostream>
#include <vector>
using namespace std;
void merge(vector<int>&a,vector<int>&dst,int s,int m,int e)
{
int i = s,j = m+1,k = s;
while(i<=m&&j<=e)
{
if(a[i]<=a[j])
{
dst[k++] = a[i++];
}
else
dst[k++] = a[j++];
}
while(i<=m)
dst[k++] = a[i++];
while(j<=e)
dst[k++] = a[j++];
}
int change(vector<int>&a,vector<int>&dst,int l,int r)
{
if(l<r)
{
int m = (l+r)/2;
change(a,dst,l,m);
change(a,dst,m+1,r);
merge(a,dst,l,m,r);
}
}
int main()
{
int n;
while(cin>>n)
{
vector<int>a(n);
vector<int>dst(n);
for(int i=0;i<n;++i)
{
cin>>a[i];
}
change(a,dst,0,n-1);
for(int i=0;i<n;++i)
{
cout<<dst[i]<<" ";
}
cout<<endl;
}
return 0;
}
2.快速排序
#include <iostream>
using namespace std;
int a[] = {100,8,15 ,37,26,13,27,49,55,14};
void quick_sort(int a[], int left, int right)
{
if(left<right)
{
int i = left;
int j = right;
int x = a[i];
while(i<j)
{
while(i<j&&a[j]>x)
j--;
if(i<j){
a[i] = a[j];
i++;
}
while(i<j&&a[i]<x)
i++;
if(i<j){
a[j] = a[i];
j--;
}
}
a[i] = x;
quick_sort(a, left, i-1);
quick_sort(a, i+1, right);
}
}
int main()
{
cout<<"Before sort: ";
for(int i =0 ; i<10;i++)
cout<<a[i]<<" ";
cout<<endl;
quick_sort(a, 0, 9);
cout<<"After sort: ";
for(int i =0 ; i<10;i++)
cout<<a[i]<<" ";
cout<<endl;
}
3.堆排序
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
void adjust(int arr[], int len, int index)
{
int left = 2*index + 1;
int right = 2*index + 2;
int maxIdx = index;
if(left<len && arr[left] > arr[maxIdx]) maxIdx = left;
if(right<len && arr[right] > arr[maxIdx]) maxIdx = right; // maxIdx是3个数中最大数的下标
if(maxIdx != index) // 如果maxIdx的值有更新
{
swap(arr[maxIdx], arr[index]);
adjust(arr, len, maxIdx); // 递归调整其他不满足堆性质的部分
}
}
void heapSort(int arr[], int size)
{
for(int i=size/2 - 1; i >= 0; i--) // 对每一个非叶结点进行堆调整(从最后一个非叶结点开始)
{
adjust(arr, size, i);
}
for(int i = size - 1; i >= 1; i--)
{
swap(arr[0], arr[i]); // 将当前最大的放置到数组末尾
adjust(arr, i, 0); // 将未完成排序的部分继续进行堆排序
}
}
int main()
{
int array[8] = {8, 1, 14, 3, 21, 5, 7, 10};
heapSort(array, 8);
for(auto it: array)
{
cout<<it<<endl;
}
return 0;
}