選擇排序,插入排序學習筆記
選擇排序: 對於一個亂序陣列(size=n) 1.尋找其中的最大(小)值 2.放到最右邊(和最後一位交換位置) 3.再從原陣列size=n-1同樣尋找最大值(此時這個是整個陣列第二大的值了(如果有兩個相同最大值不影響)) 4.繼續放到在size=n-1的最右處 5.一直迴圈到size=1結束排序 資料舉例: 3 7 4 2 6 1 (size = 6) 遍歷第一遍,找到max = 7;放到最右邊,此時: 3 1 4 2 6 7 -->我們需要的是 3 1 4 2 6(size = 5) 遍歷,找到max = 6;放到最右邊(當然6本來就在最右邊,操作後仍不變),此時: 3 1 4 2 6 --> 3 1 4 2(size = 4) 遍歷,找到max = 4;放到最右邊 3 1 2 4 --> 3 1 2 (size = 3)以此類推
程式碼實現:
#include<stdio.h> #include<iostream> using namespace std; void selection_sort(int *arr,int n); int findmax(int *arr,int n); void swap(int *a,int *b); int main(){ int arr[]={1,3,4,5,7,3,88,44,23,9}; int n = 10; selection_sort(arr,n); for(int i = 0;i<n;i++){ printf("%d ",arr[i]); } printf("\n"); return 0; } int findmax(int *arr,int n){ int max = arr[0]; int maxpos = 0; for(int i = 0;i<n;i++){ if(arr[i]>max){ max = arr[i]; maxpos = i; } } return maxpos; } void swap(int &a,int &b){ int temp = a; a = b; b = temp; } void selection_sort(int *arr,int n){ int pos; while(n){ pos = findmax(arr,n); swap(arr[pos],arr[n-1]); n--; } }
插入排序 對於一個亂序陣列(size = n) 假設其陣列左側已經有一定先後順序了(這樣更便於理解) 3 6 7 4 2 1 5,左側3 6 7已經排好序了,此時對4進行操作 儲存4的值為key = 4,以及位置pos = 3(起點) 然後和已經排好序的陣列倒序對比,此時對比的size = 4,即 3 6 7 4 arr[pos-1](7)和key(4)對比,顯然前者大,所以將7放到pos的位置上,此時陣列為 3 6 7 7 不要擔心,4的值還儲存在key中,讓pos-1,繼續操作 arr[pos-1](6)和key(4)對比,依然前者大,同樣操作,此時陣列為 3 6 6 7,繼續pos-1 此時arr[pos-1](3)和key(4)對比,key大,那麼可以跳出迴圈了,此時令arr[pos] = key,那麼陣列就變為 3 4 6 7,插入成功
補充:如 3 4 6 7 2這樣,當2一直遍歷到pos=0的時候依然沒有可以插入的位置,這時候再繼續下去會造成陣列越界,所以當pos=0就應該break出去。
程式碼實現:
#include<stdio.h>
#include<iostream>
using namespace std;
void insertion_sort(int *arr,int n);
int main(){
int arr[]={1,3,4,5,7,3,88,44,23,9};
for(int i = 1;i<10;i++){
insertion_sort(arr,i);
}
for(int i = 0;i<10;i++){
printf("%d ",arr[i]);
}
return 0;
}
void insertion_sort(int *arr,int n){
int key = arr[n];
int i = n;
while(arr[i-1]>key){
arr[i] = arr[i-1];
i--;
if(i==0)
break;
}
arr[i] = key;
}