八大經典排序

動畫演示

穩定

基數排序

冒泡排序

插入排序

直接插入排序

折半插入排序

歸併排序

遞歸實現

#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;
}

其他講解傳送門

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章