Sort

排序法

made by 吳若喬

Contents

選擇排序法
泡沫排序法
插入排序法

Selection Sort

選擇排序法

  • 將每個元素放到正確的位置

Example:從小到大排序

Finish!

Selection Sort

程式碼

how轉換成程式碼?

首先從第一個開始判斷

由小排到大,因此要判斷其他元素是否比第一個還小

Index:0 1 2 3 4
value:4 5 2 3 1

首先,我們記下第一個數值的索引值是0,數值為4

index=0

value=4

Index:0 1 2 3 4
value:4 5 2 3 1

從第二個開始,找比第一個還要小的數值

index=0

value=4

Index:0 1 2 3 4
value:4 5 2 3 1

比4小? NO

index=0

value=4

Index:0 1 2 3 4
value:4 5 2 3 1

比4小? YES

index=0

value=4

Index:0 1 2 3 4
value:4 5 2 3 1

更改索引和值

index=0

value=4

Index:0 1 2 3 4
value:4 5 2 3 1

更改索引和值

index=2

value=2

Index:0 1 2 3 4
value:4 5 2 3 1

繼續比較

index=2

value=2

Index:0 1 2 3 4
value:4 5 2 3 1

比2小?NO

index=2

value=2

Index:0 1 2 3 4
value:4 5 2 3 1

比2小? YES

index=2

value=2

Index:0 1 2 3 4
value:4 5 2 3 1

更改

index=2

value=2

Index:0 1 2 3 4
value:4 5 2 3 1

更改

index=4

value=1

Index:0 1 2 3 4
value:4 5 2 3 1

index=4

value=1

Index:0 1 2 3 4
value:1 5 2 3 4

index=4

value=1

Index:0 1 2 3 4
value:1 5 2 3 4

index=1

value=5

接著比較第二個

更新

int num[10]={4,3,5,1,2};
for(int i=0;i<5;i++){
	int idx=i,value=num[i];
	for(int j=i+1;j<5;j++){
		if(num[j]<value){
			idx=j;
			value=num[j];
		}
	}
	swap(num[i],num[idx]);
}
for(int i=0;i<5;i++){
	cout << num[i] << " ";
}
int num[10]={4,3,5,1,2};
for(int i=0;i<5;i++){
	int idx=i,value=num[i];
	for(int j=i+1;j<5;j++){
		if(num[j]<value){
			idx=j;
			value=num[j];
		}
	}
	swap(num[i],num[idx]);
}
for(int i=0;i<5;i++){
	cout << num[i] << " ";
}
int num[10]={4,3,5,1,2};
for(int i=0;i<5;i++){
	int idx=i,value=num[i];
	for(int j=i+1;j<5;j++){
		if(num[j]<value){
			idx=j;
			value=num[j];
		}
	}
	swap(num[i],num[idx]);
}
for(int i=0;i<5;i++){
	cout << num[i] << " ";
}
int num[10]={4,3,5,1,2};
for(int i=0;i<5;i++){
	int idx=i,value=num[i];
	for(int j=i+1;j<5;j++){
		if(num[j]<value){
			idx=j;
			value=num[j];
		}
	}
	swap(num[i],num[idx]);
}
for(int i=0;i<5;i++){
	cout << num[i] << " ";
}
int num[10]={4,3,5,1,2};
for(int i=0;i<5;i++){
	int idx=i,value=num[i];
	for(int j=i+1;j<5;j++){
		if(num[j]<value){
			idx=j;
			value=num[j];
		}
	}
	swap(num[i],num[idx]);
}
for(int i=0;i<5;i++){
	cout << num[i] << " ";
}
int num[10]={4,3,5,1,2};
for(int i=0;i<5;i++){
	int idx=i,value=num[i];
	for(int j=i+1;j<5;j++){
		if(num[j]<value){
			idx=j;
			value=num[j];
		}
	}
	swap(num[i],num[idx]);
}
for(int i=0;i<5;i++){
	cout << num[i] << " ";
}

Bubble Sort

泡沫排序法

  • 像泡泡一樣上浮
  • 互相比較
  • 最大/小的會先完成比較

由小到大排序

已經是最大不用比較

Finish!

Bubble Sort

程式碼

兩個兩個判斷,大小不對就交換

要注意判斷的方向

由小到大:大的要在最後

由大到小:小的要在最後

正確!

錯誤,進行交換

錯誤,進行交換

錯誤,進行交換

int num[10]={4,3,5,1,2};
for(int i=0;i<4;i++){
  for(int j=0;j<5-i-1;j++){
	if(num[j]>num[j+1]){
		swap(num[j+1],num[j]);
	}
  }
	    
}
for(int i=0;i<5;i++){
  cout << num[i] << " ";
}
int num[10]={4,3,5,1,2};
for(int i=0;i<4;i++){
  for(int j=0;j<5-i-1;j++){
	if(num[j]>num[j+1]){
		swap(num[j+1],num[j]);
	}
  }
	    
}
for(int i=0;i<5;i++){
  cout << num[i] << " ";
}
int num[10]={4,3,5,1,2};
for(int i=0;i<4;i++){
  for(int j=0;j<5-i-1;j++){
	if(num[j]>num[j+1]){
		swap(num[j+1],num[j]);
	}
  }
	    
}
for(int i=0;i<5;i++){
  cout << num[i] << " ";
}
int num[10]={4,3,5,1,2};
for(int i=0;i<4;i++){
  for(int j=0;j<5-i-1;j++){
	if(num[j]>num[j+1]){
		swap(num[j+1],num[j]);
	}
  }
	    
}
for(int i=0;i<5;i++){
  cout << num[i] << " ";
}

Insertion Sort

插入排序法

  • 將沒比較過元素的插入已排序的序列中

由小到大排序

Finish!

Insertion Sort

程式碼

將第一個預設為"已經比較過的元素"(因為前面沒有其他元素)

因此現在已排序的元素只有第一個

從第二個開始,跟已經排序過的元素比較

假設第二格的元素索引值為i

則要和所有i前面的值(value)比較

index:0 1 2 3 4
value:4 5 2 3 1
index:0 1 2 3 4
value:4 5 2 3 1

設定一個變數j

紀錄前面已排序元素的索引值

index:0 1 2 3 4
value:4 5 2 3 1

首先j=i-1

(不用跟自己比較)

index:0 1 2 3 4
value:4 5 2 3 1

在此情況下

i=1,j=0

此序列[j]>此序列[i]?

否,不用進行插入動作

index:0 1 2 3 4
value:4 5 2 3 1

在此情況下

i=2,j=1

此序列[j]>此序列[i]?

是,進行插入動作

index:0 1 2 3 4
value:4 5 2 3 1

Now:i=2,j=1

先把2這個值儲存在變數value

5>value,將5往後挪

index:0 1 2 3 4
value:4 5 2 3 1

Now:i=2,j=1

value=2

index:0 1 2 3 4
value:4 5 2 3 1

Now:i=2,j=1,value=2

第j格已經比較過

j-1格繼續比較

index:0 1 2 3 4
value:4 5 5 3 1

Now:i=2,j=0,value=2

4>value,將第0格往後挪

index:0 1 2 3 4
value:4 4 5 3 1

Now:i=2,j=0,value=2

4>value,將第0格往後挪

index:0 1 2 3 4
value:4 4 5 3 1

Now:i=2,j=0,value=2

根據現在j的位置

要把value(本來的值)插入其中

index:0 1 2 3 4
value:2 4 5 3 1

Now:i=2,j=0,value=2

根據現在j的位置

要把value(本來的值)插入其中

int num[10]={4,3,5,1,2};
for(int i=1;i<5;i++){
	int j=i-1,value=num[i];
	    while(num[j]>value){
	        num[j+1]=num[j];
	        idx--;
	    }
	    num[j+1]=value;
    }
for(int i=0;i<5;i++){
	cout << num[i] << " ";
}
int num[10]={4,3,5,1,2};
for(int i=1;i<5;i++){
	int idx=i-1,value=num[i];
	    while(num[idx]>value){
	        num[idx+1]=num[idx];
	        idx--;
	    }
	    num[idx+1]=value;
    }
for(int i=0;i<5;i++){
	cout << num[i] << " ";
}
int num[10]={4,3,5,1,2};
for(int i=1;i<5;i++){
	int idx=i-1,value=num[i];
	    while(num[idx]>value){
	        num[idx+1]=num[idx];
	        idx--;
	    }
	    num[idx+1]=value;
    }
for(int i=0;i<5;i++){
	cout << num[i] << " ";
}
int num[10]={4,3,5,1,2};
for(int i=1;i<5;i++){
	int idx=i-1,value=num[i];
	    while(num[idx]>value){
	        num[idx+1]=num[idx];
	        idx--;
	    }
	    num[idx+1]=value;
    }
for(int i=0;i<5;i++){
	cout << num[i] << " ";
}
int num[10]={4,3,5,1,2};
for(int i=1;i<5;i++){
	int idx=i-1,value=num[i];
	    while(num[idx]>value){
	        num[idx+1]=num[idx];
	        idx--;
	    }
	    num[idx+1]=value;
    }
for(int i=0;i<5;i++){
	cout << num[i] << " ";
}

std::sort

排序函式

  • 可自定義排序規則
  • 預設可更改升冪or降冪
#include <algorithm>
std::sort(迭代器的頭, 迭代器的尾, 排序規則(預設升冪));
int num[10]={4,3,5,1,2};
sort(num,num+5);
for(int i=0;i<5;i++){
   cout << num[i] << " ";
}
4 3 5 1 2
num num+1 num+2 num+3 num+4
#include <algorithm>
//由小到大
std::sort(迭代器的頭, 迭代器的尾, less<int>());

//由大到小
std::sort(迭代器的頭, 迭代器的尾, greater<int>());
int cmp(int a,int b){
    return a<b;
}

int main()
{
    int num[10]={4,3,5,1,2};
    sort(num,num+5,cmp);
    for(int i=0;i<5;i++){
        cout << num[i] << " ";
    }
    return 0;
}

Hw:

輸入兩個數字n、k,代表接下來有n個數要進行排序,k代表升序或降序,0為升序,1為降序。接下來有一行,共n個數字用空白隔開。

繳交main.c檔在GC就好了!

範例測資:

5 1

4 5 1 2 3

 

輸出:

5 4 3 2 1

卡戶!

Made with Slides.com