大社課[6]
建中電子計算機研習社
- 225班
- 電子計算機研習社_學術長
- 綽號807
這我
- swap
- selection sort
- bubble sort
- insert sort
- merge sort
今天的內容: 排序
Swap
假設我們今天有兩個值
那我們要如何將個個值交換
交換
想想看吧?
方法0
- 將 暫存至另一個變數 中
- 讓
- 讓
- 完成
交換-方法0
a
c
a=b
b=c
c=a
int c=a;
a=b;
b=c;
程式碼
方法一
- 位元Xor
- 這可能有點難理解
- 一個一個看就知道了
交換-方法1
a^=b^=a^=b;
程式碼
方法二
交換-方法2
哈哈哈你們都被騙了
- 其實有內建的
- 記得要using namespace std;
- (平常就加了對吧
交換-方法2
swap(a,b);
程式碼
Selection Sort
- 選擇排續
- 找出最小值
- 放到最前面
- 找出第1小的
- 放到第1位 (0-base)
- 複雜度
O(n^2)
O(n^2)
- 從第0個開始
- 暴力找出最小值
- 第0個和最小值交換
- 移動到第一個
Selection Sort
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
vector<int> data(n);
for(int i=0;i<n;i++) cin>>data[i];
//selection sort
for(int i=0,Min;i<n-1;i++){
Min=i;
for(int j=i+1;j<n;j++){
if(data[j]<data[Min]) Min=j;
}
swap(data[i],data[Min]);
}
//end
for(int i=0;i<n;i++) cout<<data[i]<<" ";
cout<<endl;
}
# PRESENTING CODE
Bubble Sort
- 泡泡排序
- 一直前後交換
- 複雜度
O(n^2)
- 設定左界
- 對於位置 從 開始向右
- 必較位置 和 的值,判斷是否交換
- 左界增加
i=0
j
i
j
j+1
Bubble Sort
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
vector<int> data(n);
for(int i=0;i<n;i++) cin>>data[i];
//bubble sort
for(int i=0;i<n;i++){
for(int j=0;j<n-i-1;j++){
if(data[j]>data[j+1]) swap(data[j],data[j+1]);
}
}
//end
for(int i=0;i<n;i++) cout<<data[i]<<" ";
cout<<endl;
}
# PRESENTING CODE
Insert Sort
- 插入排序
- 找到一個數
- 插入進已經排序好的部分
- 複雜度
O(n^2)
- 從第1個開始 (0-base)
- 向前比較
- 前面比較大,則向後移
- 這個比較大,則結束
- 到第2個
Insert Sort
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
vector<int> data(n);
for(int i=0;i<n;i++) cin>>data[i];
//insert sort
int tmp;
for(int i=1,j;i<n;i++){
tmp=data[i];
for(j=i-1;j>=0&&data[j]>tmp;j--) data[j+1]=data[j];
data[j+1]=tmp;
}
//end
for(int i=0;i<n;i++) cout<<data[i]<<" ";
cout<<endl;
}
# PRESENTING CODE
Merge Sort
- 合併排序
- 將已經排好的兩半合併
- 複雜度
O(n \times log(n))
- 兩半都是開頭最小
- 選擇小的那邊
- 選完為止
- 複雜度
合併
O(n)
- 若 複雜度為
- 則n的排序複雜度為
複雜度
O(\frac{n}{2} \times log(\frac{n}{2}))
O(n \times (log(n)-1) + n)
O(n \times log(n))
\frac{n}{2}
O((\frac{n}{2} \times log(\frac{n}{2})) \times 2 + n)
排序一半
合併
底數是2
log
Merge Sort
#include<bits/stdc++.h>
using namespace std;
void mergesort(int l,int r,vector<int> &data){
if(r-l==1) return ;
int mid=l+r>>1,tmp_len=mid-l;
mergesort(l,mid,data),mergesort(mid,r,data);
vector<int> tmp(tmp_len);
for(int i=0;i<tmp_len;i++) tmp[i]=data[i+l];
for(int L=0,R=mid,i=l;L<tmp_len;i++){
if(tmp[L]<data[R]||R==r) data[i]=tmp[L++];
else data[i]=data[R++];
}
return ;
}
int main(){
int n;
cin>>n;
vector<int> data(n);
for(int i=0;i<n;i++) cin>>data[i];
mergesort(0,n,data);
for(int i=0;i<n;i++) cout<<data[i]<<" ";
cout<<endl;
}
# PRESENTING CODE
其他排序
- quick sort
- bucket sort
- heap sort
- counting sort
- 還有很多 sort
其他排序
內建的
- 混和排序
- 反正比較強
- 小社課教過了
那我就不講了
內建的排序
ckeisc-6
By 建中店自計算機研習社學術長807⁸⁰⁷
ckeisc-6
swap & sort
- 188