大社課[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)
  1. 從第0個開始
  2. 暴力找出最小值
  3. 第0個和最小值交換
  4. 移動到第一個

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)
  1. 設定左界
  2. 對於位置   從   開始向右
  3. 必較位置   和          的值,判斷是否交換
  4. 左界增加
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. 從第1個開始 (0-base)
  2. 向前比較
    1. 前面比較大,則向後移
    2. 這個比較大,則結束
  3. 到第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

其他排序

其他排序

內建的

  • 混和排序
  • 反正比較強
  • 小社課教過了那我就不講了

內建的排序

Made with Slides.com