排序法
made by 吳若喬
選擇排序法
泡沫排序法
插入排序法
選擇排序法
Example:從小到大排序
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] << " ";
}泡沫排序法
由小到大排序
已經是最大不用比較
Finish!
程式碼
兩個兩個判斷,大小不對就交換
要注意判斷的方向
由小到大:大的要在最後
由大到小:小的要在最後
正確!
錯誤,進行交換
錯誤,進行交換
錯誤,進行交換
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] << " ";
}插入排序法
由小到大排序
Finish!
程式碼
將第一個預設為"已經比較過的元素"(因為前面沒有其他元素)
因此現在已排序的元素只有第一個
從第二個開始,跟已經排序過的元素比較
假設第二格的元素索引值為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] << " ";
}排序函式
#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
卡戶!