以整形數組元素為例,有數組A[10](以C語言為例描述),即A[0],A[1],…,A[8],A[9](假設其元素均互不相同)。要求對其元素排序使之遞增有序。
首先以一個元素為基準,從一個方向開始掃描,比如從左至右掃描,以A[0]為基準。
接下來從A[0],…,A[9]中找出最小的元素,將其與A[0]交換。
然後將基準位置右移一位,重複上面的動作,比如,以A[1]為基準,找出A[1]~A[9]中最小的,將其與A[1]交換。
一直進行到基準位置移到數組最後一個元素時排序結束(此時基準左邊所有元素均遞增有序,而基準為最後一個元素,故完成排序)。
以下為一個用C描述的函式用兩者方式(本質都是選擇排序法,但是第二種代碼較少)實現上述排序:
第一種:
void sort(int array[],int n)
{ // n 為數組元素個數
int i,j,k,temp; // i 為基準位置,j 為當前被掃描元素位置,k 用於暫存出現的較小的元素的位置
for(i=0;i<n-1;i++)
{k=i;//初始化為基準位置
for(j=i+1;j<n;j++)
{
if (array[j]<array[k]) k=j ; // k 始終指示出現的較小的元素的位置
} //for
if(k!=i)
{ temp=array[i];
array[i]=array[k];
array[k]=temp; // 將此趟掃描得到的最小元素與基準互換位置
}
}
}
第二種:
void sort(int array[],int n)
{ // n 為數組元素個數
int i,j,k,temp; // i 為基準位置,j 為當前被掃描元素位置,k 用於暫存出現的較小的元素的位置
for(i=0;i<n-1;i++)
{k=i;//初始化為基準位置
for(j=i+1;j<n;j++)
{
if (array[j]<array[k]) // k 始終指示出現的較小的元素的位置
{ temp=array[j];
array[j]=array[k];
array[k]=temp;}// 將此趟掃描得到的最小元素與基準互換位置
}
}
}
其實現相對簡單,效率比較低,時間複雜度為O(n2) (n 的平方) ,為就地排序。
--------------
選擇排序(Straight Selection Sort)選擇排序的基本思想
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](1≤i≤n-1)。該趟排序從當前無序區中選出關鍵字最小的記錄 R[k],將它與無序區的第1個記錄R[i]交換,使R[1..i]和R[i+1..n]分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。
這樣,n個記錄的檔案的直接選擇排序可經過n-1趟直接選擇排序得到有序結果。
using System;
using System.Collections.Generic;
using System.Text;
namespace ExSelectionSorter
{
class SelectionSorter
{
private int min;
public void Sort(int[] arr)
{
for (int i = 0; i < arr.Length - 1; ++i)
{
min = i;
for (int j = i + 1; j < arr.Length; ++j)
{
if (arr[j] < arr[min])
min = j;
}
int t = arr[min];
arr[min] = arr[i];
arr[i] = t;
}
}
static void Main(string[] args)
{
int[] array = new int[] { 1, 5, 3, 6, 10, 55, 9, 2, 87, 12, 34, 75, 33, 47 };
SelectionSorter s = new SelectionSorter();
s.Sort(array);
foreach (int m in array)
Console.WriteLine("{0}", m);
}
}
}
相關詞條
-
用選擇法對10個整數排序
用選擇法對10個整數排序,用scanf輸入。
-
快速排序
快速排序(QuickSort)是一種有效的排序算法。雖然算法在最壞的情況下運行時間為O(n^2),但由於平均運行時間為O(nlogn),並且在記憶體使用、...
實現 性質 時空複雜度 隨機化算法 減少遞歸棧使用的最佳化 -
選擇法
現代伊斯蘭教法改革過程中經常採取的一種靈活變通的方法。系阿拉伯語“泰哈尤爾”的意譯,意即根據社會立法需要,在各種不同意見中加以廣泛的選擇,作為立法的法理...
簡介 選擇法舉例 -
排序算法
所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。不穩定排序算法可能會在相等的鍵值中改變紀錄的相對次序,但是穩定排...
分類 C++算法 算法列表 排序的算法 複雜度 -
鍊表選擇法
#defin #defin #defin
‍鍊表選擇法 內容簡介 C語言算法實現 編譯運行說明 -
離散選擇法
離散選擇法(Discrete choice approach,縮寫DCA,也作Discrete choice model,即“離散選擇模型”)屬於多重變...
簡介 臨界值模型的假設 隨機效用模型的假設 套用領域舉例 多變數統計分析 -
快速排序算法
快速排序(Quicksort)是對冒泡排序的一種改進。 快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通過一趟排序將要排序的數...
算法介紹 排序演示 示例代碼 最佳化 變種 -
選擇排序法
選擇排序法 是對 定位比較交換法(也就是冒泡排序法) 的一種改進。選擇排序的基本思想是:每一趟在n-i+1(i=1,2,…n-1)個記錄中選取關鍵字最小...
基本思想 算法 -
計算機網路體系結構
組成結構一、計算機系統和終端計算機系統和終端提供網路服務界面。地域集中的多個獨立終端可通過一個終端控制器連入網路。二、通信處理機...
組成結構 體系結構 層次結構 網路體系結構