1. 程式人生 > >選擇排序,插入排序學習筆記

選擇排序,插入排序學習筆記

選擇排序: 對於一個亂序陣列(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;
}