選擇(select)排序算法

直接排序是不穩定的排序。

1、直接排序算法的基本思想

n個記錄的直接選擇排序可經過n-1趟直接選擇排序得到有序結果。

(1) 初始狀態:無序區爲A[1...n],有序區爲空。

(2) 第一趟排序:在無序區A[1...n]中選出最小的記錄A[k],將他與無序區的第一個記錄A[1]交換,使A[1...1]和A[2...n]分別變爲記錄個數增加1的新有序區和記錄個數減少1的新無序區。

(3)第i趟排序:第i趟排序開始時,當前有序區和無序區分別爲A[1.,.i-1]和A[i...n](1<=i<=n-1)。該趟排序從當前無序區中選出關鍵字最小的記錄A[K],將它與無序區的第一個記錄A[I]交換,使A[1...n]和A[I+1...n]分別變爲記錄個數增加1的新有序區和記錄個數減少1的新無序區。這樣,n個記錄的文件的直接選擇排序可經過n-1趟直接選擇排序得到有序結果。直接選擇排序是不穩定的排序算法。

2、思想

首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小元素,然後放到排序序列末尾。以此類推,直到所有元素均排序完畢。具體做法是:選擇最小的元素與未排序部分的首部交換,使得序列的前面爲有序。

3、算法複雜度

最好情況下:交換0次,但是每次都要找到最小的元素,因此大約必須遍歷N*N次,因此爲O(N*N)。減少了交換次數

最壞情況下,平均情況下:O(N*N)

4、穩定性

 由於每次都是選取未排序序列A中的最小元素x與A中的第一個元素交換,因此跨距離了,很可能破壞了元素間的相對位置,因此選擇排序是不穩定的!

5、代碼實現

//編程實現選擇排序
//顧名思義,選擇排序是無序區中選擇最小的一個元素放在第一位置,次小的元素放到第二個位置。
//1.選擇第一個元素即a[0]爲臨時元素爲最小,遍歷後面的元素與之比較,只要出現比tempMin小的數a[j],將a[j]賦值給tempMin。
//2.將第一個元素與後面最小元素的位置進行交換(a[l]=a[i]),最小元素放到第一個元素位置上。
//3.重複上述操作,直至將整個數組遍歷一遍,i=0;i<len-1,i++;內層循環爲j=i+1;j<len;j++.
#include<iostream>
using namespace std;

void select_sort(int a[], int len)
{
	int i,j,l, tempMin;							
	for (i = 0; i < len-1; i++)				<span style="white-space:pre">	</span>//對0~len-2進行循環,進行len-1次
	{
		tempMin = a[i];						//每次都取無序區的第一個數爲臨時最小數
		l = i;							//記錄臨時最小數的下標(無序區第一個元素下標)
		for (j = i+1; j < len; j++)			<span style="white-space:pre">	</span>//從i+1的位置(臨時最小數的後一位)向數組尾部進行遍歷
		{
			if (a[j] < tempMin)				//無序區+1到數組尾部有小於臨時最小數
			{
				tempMin = a[j];				//tempMin保存每次遍歷搜索到的最小數
				l = j;					//l記錄最小數的位置
			}
		}
		a[l] = a[i];						//把最小元素與a[i](無序區第一個元素)進行交換
		a[i] = tempMin;
	}
}

static void print_array(int a[], int len)
{
	for (int i = 0; i < len; i++)			<span style="white-space:pre">		</span>//打印數組
	{
		cout << a[i] << " ";
	}
}

void main9mianshiti5()
{
	int a[] = { 54, 38, 96, 23, 15, 72, 60, 45, 83 };
	cout << "before select sort:";
	print_array(a, 9);
	select_sort(a, 9);						//選擇排序
	cout << "\nafter select sort:";
	print_array(a, 9);
	system("pause");
}

6、測試結果

before select sort:54 38 96 23 15 72 60 45 83

after select sort:15 23 38 45 54 60 72 83 96

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章