1. 程式人生 > >八大排序———選擇排序

八大排序———選擇排序

一:選擇排序的原理

  n個數據的檔案可經過n-1趟直接選擇排序得到有序結果。

 ①初始狀態:無序區 R[1....n] ,有序區為空。

 ②第一趟排序:在無序區R[1....n]選出下標最小的記錄R[1],通過比較獲得無序區中最小的,將他與無序區的第一個記錄R[1]交換,使得R[1..1]和R[2...n]成為新的有序區域,和新的無序區域。

 ③第i趟排序:第i趟開始時,有序區域R[1......i-1],無序區為R[i....n],該趟排序是從無序區中選擇下標最小的記錄R[i],和無序區中資料比較獲得最小的R[k]和R[i]交換.使得新的有序區域加一。R[1...i]。

二:演算法描述

#include<iostream>
using namespace std;

template<typename T>
void selectsort(T arr[],int len)
{
		T temp = T();
		for(int i=0;i<len-1;i++)
		{
				temp = arr[i];//記錄從頭開始的元素,
				int pos = i;//記錄位置
				for(int j=i+1;j<len;++j)//從下一個位置開始
				{
						if(arr[j]>temp)//改變temp的資訊
						{
								temp = arr[j];
								pos = j;
						}
				}
				arr[pos] = arr[i];
				arr[i] = temp;

		}
}
int main()
{
		int arr[]={15,49,89,2,46,61,35,35,49,9,41};
		int len = sizeof(arr)/sizeof(arr[0]);
		selectsort(arr,len);
		for(int i=0;i<len;++i)
		{
				cout<<arr[i]<<" ";
		}
		cout<<endl;

		double brr[]={15.2,16.9,48.3,2.2,16.3,5,4.6,15.32};
		int len1 = sizeof(brr)/sizeof(brr[0]);
		selectsort(brr,len1);
		for(int j=0;j<len1;++j)
		{
				cout<<brr[j]<<" ";
		}
		cout<<endl;
		return 0;
}

三:時間複雜度

  選擇排序的交換操作介於0和(n-1)次之間(每趟比較都要比較一次)。選擇排序的比較操作為n-1 + n-2 +n-3 ..........1 =>n(n-1)/2次之間。

所以比較次數O(n^2),而交換次數O(n),最好的情況是,已經有序,交換0次;最壞的情況是交換n-1次,逆序交換n/2次。交換次數比氣泡排序少多了,由於交換所需要CPU時間比比較所需的CPU時間多,n較小時,選擇排序比氣泡排序快。

四:穩定性

  選擇排序是給每個位置選擇當前元素最小的,比如給第一個位置選擇最小的,在剩餘元素裡面給第二個元素選擇第二小的,一次類推,直到第n-1個元素,第n個元素就不用選擇了,因為只剩下它一個最大的元素了。

         那麼,在一趟選擇,如果一個元素比當前元素小,而該小的元素又出現在一個和當前元素相等的元素後面,那麼交換後穩定性就被破壞了。例如:序列5 8 5 2 9,我們知道第一遍選擇第一個元素5會和2交換,那麼原序列中兩個5的相對順序就被破壞了,所以選擇排序是一個不穩定的演算法。

  五:樹形選擇排序

        待更新