排序---冒泡、插入、桶、快速、歸併
阿新 • • 發佈:2018-11-09
排序—冒泡、插入、桶、快速、歸併
氣泡排序
#include<bits/stdc++.h> using namespace std; int a[]={1,28,22,3,12,3,3,232,23,4,5}; void printArr(int *a,int length){ for(int i=0;i<length;i++) cout<<a[i]<<" "; } int main(){ bool flag = false; //氣泡排序外層length次,內層length-外層次數 //每次對比前後一個數的大小,並把較大的數供到後面 //如果本輪沒有拱資料說明陣列以及有序結束查詢 int length = sizeof(a)/4; for(int i=length-1;i>0;i--){ flag = true; for(int j=0;j<i;j++){ if(a[j]>a[j+1]){ swap(a[j],a[j+1]); flag = false; } } if(flag) break; } printArr(a,length); return 0; }
應用習題:
車廂重組
在一箇舊式的火車站旁邊有一座橋,其橋面可以繞河中心的橋墩水平旋轉。一個車站的職工發現橋的長度最多能容納兩節車廂,如果將橋旋轉180度,則可以把相鄰兩節車廂的位置交換,用這種方法可以重新排列車廂的順序。於是他就負責用這座橋將進站的車廂按車廂號從小到大排列。他退休後,火車站決定將這一工作自動化,其中一項重要的工作是編一個程式,輸入初始的車廂順序,計算最少用多少步就能將車廂排序。
輸入
輸入檔案有兩行資料,第一行是車廂總數N(不大於10000),第二行是N個不同的數表示初始的車廂順序。
輸出
一個數據,是最少的旋轉次數。
輸入樣例
4 4 3 2 1
輸出樣例
6
做題連結:
https://www.luogu.org/problemnew/show/P1116
歐陽的解
#include<bits/stdc++.h> using namespace std; int main(){ int n,count=0; bool flag = true; cin>>n; int a[n]; for(int i=0;i<n;i++) cin>>a[i]; for(int i=n-1;i>0;i--){ flag = true; for(int j=0;j<i;j++){ if(a[j]>a[j+1]){ swap(a[j],a[j+1]); flag = false; count++; } } if(flag) break; } cout<<count; return 0; }
插入排序
#include<bits/stdc++.h>
using namespace std;
int main(){
//得到陣列
int n;
cin>>n;
int a[n];
for(int i=0;i<n;i++)
cin>>a[i];
//迴圈遍歷插入
for(int i=1;i<n;i++)
for(int j=i;j>0;j--){
if(!(a[j]<a[j-1]))
//j->i-1每個元素向後移動一個位置
break;
swap(a[j-1],a[j]);
}
//輸出
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
return 0;
}
彭星霖的方法
#include<bits/stdc++.h>
using namespace std;
int main() {
int a[]= {5,4,1,3};
for(int i=1; i<4; i++)
if(a[i]<a[i-1]) {
swap(a[i],a[i-1]);
i=0;
}
for(int i=0; i<4; i++)
cout<<a[i];
return 0;
}
桶排序
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[] = {6,4,3,6,4,3,6,4,3,6,4,3};
int k[101];
memset(k,0,sizeof(k));
int n=sizeof(a)/4;
for(int i=0;i<n;i++)
k[a[i]]++;
for(int i=0;i<101;i++){
while(k[i]-->0)
cout<<i<<" ";
}
return 0;
}
快速排序
#include<bits/stdc++.h>
using namespace std;
void mysort(int *a,int l,int r){
if(l>=r)
return;
int base = a[l],i=l,j=r;
while(i<j){
while(j>i&&a[j]>=base) j--;
while(i<j&&a[i]<=base) i++;
swap(a[i],a[j]);
}
swap(a[l],a[i]);
for(int i=0;i<8;i++)
cout<<a[i]<<" ";
cout<<i<<"::"<<j<<endl;
mysort(a,l,i);
mysort(a,i+1,r);
}
int main(){
int a[] = {6,4,3,1,36,6,73,3};
int n = sizeof(a)/4;
mysort(a,0,n-1);//對left左右進行劃分的函式,使得劃分之後左邊大於bse,右邊小於base
cout<<"result:";
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
return 0;
}
歸併排序
#include<bits/stdc++.h>
using namespace std;
void mysort(int *r,int *a,int s,int e){
if(s>=e)
return;
int mid = (e+s)/2;
cout<<"mid:"<<mid<<endl;
mysort(r,a,s,mid);
mysort(r,a,mid+1,e);
int i=s,j=mid+1,k=s;
while(i<=mid&&j<=e){
if(a[i]<a[j])
r[k++]=a[i++];
else
r[k++]=a[j++];
cout<<"k="<<k-1<<";r[k]="<<r[k-1]<<endl;
}
while(i<=mid)
r[k++]=a[i++];
while(j<=e)
r[k++]=a[j++];
for(int i=s;i<=e;i++)
a[i]=r[i];
}
int main(){
int a[] = {6,4,3,6,4,3,6,4,3,6,4,3};
int n = sizeof(a)/4;
int r[n];
mysort(r,a,0,n-1);//對s到e個元素進行分解後歸併
for(int i=0;i<n;i++)
cout<<r[i]<<" ";
return 0;
}