直接排序是不穩定的排序。
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