穩定
基數排序
冒泡排序
插入排序
直接插入排序
折半插入排序
歸併排序
遞歸實現
#include<vector>
#include<iostream>
using namespace std;
void swap(int &a,int &b)
{
int tmp=a;
a=b;
b=tmp;
return;
}
void merge_sort(vector<int>&arr,int l,int r)
{
if(l==r)return; //奇數個數排序會多出單個
if(l==r-1) //兩個或一個觸底
{
if(arr[l]>arr[r])swap(arr[l],arr[r]);
return;
}
int lp=l,mid=(l+r+1)/2,rp=mid,tp=0;
merge_sort(arr,l,mid-1); //左邊排序
merge_sort(arr,mid,r); //右邊排序
vector<int>tmp(r-l+1,0);
while(tp<r-l+1) //合併
{
if(lp==mid)
tmp[tp++]=arr[rp++]; //左塊到達邊界
else if(rp==r+1)
tmp[tp++]=arr[lp++]; //右塊到達邊界
else if(lp<mid&&arr[lp]<=arr[rp]) //沒到邊界 左邊比右邊小
tmp[tp++]=arr[lp++];
else if(rp<=r&&arr[rp]<=arr[lp]) //沒到邊界 右邊比左邊小
tmp[tp++]=arr[rp++];
}
for(int i=l;i<=r;i++)
arr[i]=tmp[i-l];
}
int main()
{
int n=0;
cin>>n;
vector<int>arr(n,0),res(n,0);
for(int i=0;i<n;i++)
cin>>arr[i];
merge_sort(arr,0,n-1);
for(int i=0;i<n;i++)
cout<<arr[i]<<" ";
return 0;
}
非遞歸實現,意義不大,都是用stack存臨時數據
不穩定
直接選擇排序
堆排序
希爾排序
快速排序
遞歸實現
#include<vector>
#include<iostream>
using namespace std;
void swap(int &a,int &b)
{
int tmp=a;
a=b;
b=tmp;
return;
}
void quick_sort(vector<int>&arr,int l,int r)
{
if(l==r)return;
if(l==r-1)
{
if(arr[l]>arr[r])swap(arr[l],arr[r]);
return;
}
else
{
int lp=l,rp=r,mid=(l+r)/2;
if(arr[l]>arr[mid])swap(arr[l],arr[mid]);
if(arr[l]>arr[r])swap(arr[l],arr[r]);
if(arr[r]>arr[mid])swap(arr[r],arr[mid]);
while(lp<rp)
{
while(arr[++lp]<=arr[r]);
while(arr[--rp]>=arr[r]);
if(lp<=rp)swap(arr[lp],arr[rp]);
else break;
}
swap(arr[lp],arr[r]);
quick_sort(arr,l,lp-1);
quick_sort(arr,lp+1,r);
}
}
int main()
{
int n=0;
cin>>n;
vector<int>arr(n,0);
for(int i=0;i<n;i++)
cin>>arr[i];
quick_sort(arr,0,n-1);
for(int i=0;i<n;i++)
cout<<arr[i]<<" ";
return 0;
}
非遞歸實現
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
void swap(vector<int>& d, int l,int r)
{
int tmp = d[l];
d[l] = d[r];
d[r] = tmp;
}
int main()
{
int n = 0, cnt = 0;
cin >> n;
vector<int> d(n, 0);
while (cnt < n)
cin >> d[cnt++];
stack<int>b, e;
b.push(0);
e.push(n-1);
while (!b.empty())
{
int left = b.top();
b.pop();
int right = e.top();
e.pop();
if (left >= right)continue;
int l = left, r = right, mid = (l + r) / 2;
if (d[l] > d[mid])swap(d, l, mid);
if (d[r] > d[mid])swap(d, r, mid);
if (d[l] > d[r])swap(d, l, r);
mid = r;
while (l < r)
{
while (d[++l] <= d[mid]);
while (d[--r] >= d[mid]);
if(l<=r)swap(d,l,r);
}
swap(d,mid,l);
b.push(left);
e.push(l - 1);
b.push(l + 1);
e.push(right);
}
for (int& i : d)cout << i;
return 0;
}