【數據結構】選擇排序算法示例


基本選擇排序編輯

排序算法即解決以下問題的算法:

輸入

n個數的序列<a1,a2,a3,...,an>。
 
輸出
原序列的一個重排<a1*,a2*,a3*,...,an*>;,使得a1*<=a2*<=a3*<=...<=an*
排序算法有很多,包括 插入排序冒泡排序堆排序歸並排序,選擇排序, 計數排序基數排序桶排序快速排序等。插入排序,堆排序,選擇排序,歸並排序和快速排序,冒泡排序都是比較排序,它們通過對 數組中的元素進行比較來實現排序,其他排序算法則是利用非比較的其他方法來獲得有關輸入數組的排序信息。

思想

n個記錄的文件的 直接選擇排序可經過n-1趟直接選擇排序得到有序結果:
①初始狀態:無序區為R[1..n],有序區為空。
②第1趟排序
在無序區R[1..n]中選出 關鍵字最小的記錄R[k],將它與無序區的第1個記錄R[1]交換,使R[1..1]和R[2..n]分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。
……
③第i趟排序
第i趟排序開始時,當前有序區和無序區分別為R[1..i-1]和R(i..n)。該趟排序從當前無序區中選出關鍵字最小的記錄 R[k],將它與無序區的第1個記錄R交換,使R[1..i]和R分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。

通俗的解釋

對比數組中前一個元素跟后一個元素的大小,如果后面的元素比前面的元素小則用一個變量k來記住他的位置,接着第二次比較,前面“后一個元素”現變成了“前一個元素”,繼續跟他的“后一個元素”進行比較如果后面的元素比他要小則用變量k記住它在數組中的位置(下標),等到循環結束的時候,我們應該找到了最小的那個數的下標了,然后進行判斷,如果這個元素的下標不是第一個元素的下標,就讓第一個元素跟他交換一下值,這樣就找到整個數組中最小的數了。然后找到數組中第二小的數,讓他跟數組中第二個元素交換一下值,以此類推。
 
代碼實現:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<ctime>
#define SIZE 15
using namespace std;

void selectSort(int *a, int len){
	int h;
	int tmp;
	for(int i=0; i<SIZE-1; i++){
		int k=i;
		for(int j=i+1; j<len; j++){
			if(a[j]<a[k])
			k=j;
		}
		if(k!=i){
			tmp=a[i];
			a[i]=a[k];
			a[k]=tmp;
		}
		cout<<"第"<<i<<"步排序結果為:";
		for(int h=0; h<len ; h++){
			cout<<a[h]<<" ";
		}
		cout<<endl;
	}
}

int main(){
	int array[SIZE];
	srand(time(NULL));
	for(int i=0 ;i<SIZE; i++){
		array[i]=rand()/1000+100;
	}	
	cout<<"排序前的序列為:"<<endl;
	for(int i=0; i<SIZE; i++){
		cout<<array[i]<<" "; 
	}
	cout<<endl<<endl;
	selectSort(array, SIZE);
	cout<<endl;
	cout<<"排序后的序列為:"<<endl;
	for(int i=0; i<SIZE; i++){
		cout<<array[i]<<" ";
	}
	return 0;
} 

 

運行結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM