1. 程式人生 > >排序演算法之 選擇排序 及其時間複雜度和空間複雜度

排序演算法之 選擇排序 及其時間複雜度和空間複雜度

        選擇排序(Selection sort)是一種簡單直觀的排序演算法。它的工作原理是每一次從待排序的資料元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。 選擇排序是不穩定的排序方法(比如序列[5, 5, 3]第一次就將第一個[5]與[3]交換,導致第一個5挪動到第二個5後面)

演算法分析

        其實選擇排序是非常簡單的,和氣泡排序有異曲同工之妙。就是把元素分成兩部分,一部分是有序的,另外一部分是無序的;每次迴圈從無序的元素中選取一個元素放到有序的元素中,依次迴圈到最後把所有元素都放到了有序那一部分中(也就是無序部分,元素為零);

        基本思路:

        1、外迴圈:迴圈每個位置(其實就是選擇了這個位置,然後用內迴圈去選擇一個合適的數,放到這個位置);

        2、內迴圈:在無序元素中選擇一個合適的數;

        3、把第二步選中的資料放到第一步選中的位置上就可以了;

實現程式碼

#include<stdio.h>
 // 列印陣列元素
 void print_array(int *array, int length)
 {
     int index = 0;
     printf("array:\n");
     for(; index < length; index++){
         printf(" %d,", *(array+index));
     }   
     printf("\n\n");
 }
 
 void selectSort(int array[], int length)
 {
     int i, j, tmp;
     // 條件判斷
     if (1 >= length) return;
     // 迴圈每個位置,為該位置選擇合適資料
     for (i = 0; i < length; i++){
         tmp = i;
         for (j = i; j < length; j++){
             if (array[tmp] < array[j]) tmp = j;// 選擇合適資料
         }   
         if (i != tmp){   // 把選擇好的資料放到外迴圈中選中的位置中
             j = array[tmp];
             array[tmp] = array[i];
             array[i] = j;
         }   
     }   
 }
 
 int main(void)
 {
     int array[12] = {1,11,12,4,2,6,9,0,3,7,8,2};
     print_array(array, 12);
     selectSort(array, 12);
     print_array(array, 12);
     return 0;
 }
 

 執行結果:

 

時間複雜度

        選擇排序的時間複雜度不像前面幾種排序方法那樣,前面幾種排序方法的時間複雜度不是一眼就能看出來的,而是要通過推導計算才能得到的。一般會涉及到遞迴和完全二叉樹,所以推導也不是那麼容易。但是選擇排序就不一樣了,你可以很直觀的看出選擇排序的時間複雜度:就是兩個迴圈消耗的時間;        比較時間:T = (n-1))+ (n -2)+(n - 3).... + 1;  ===>>  T =  [n*(n-1) ] / 2;  交換時間:最好的情況全部元素已經有序,則 交換次數為0;最差的情況,全部元素逆序,就要交換 n-1 次;        所以最優的時間複雜度  和最差的時間複雜度   和平均時間複雜度  都為 :O(n^2)

空間複雜度

        空間複雜度,最優的情況下(已經有順序)複雜度為:O(0) ;最差的情況下(全部元素都要重新排序)複雜度為:O(n );;平均的時間複雜度:O(1)

相關推薦

排序演算法 選擇排序 及其時間複雜空間複雜

        選擇排序(Selection sort)是一種簡單直觀的排序演算法。它的工作原理是每一次從待排序的資料元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。 選擇排序是不穩定的排序方法(比如序列[5, 5, 3]第一次就將第

排序演算法選擇排序(直接選擇、堆排序

排序演算法穩定性 假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序後的序列中,r[i]仍在r[j]之前,則稱這種排序演算法是穩定的;否則稱為不穩定的。 ————百度百

經典排序演算法--選擇排序

瞭解了前兩種排序演算法,再來看選擇排序已經很簡單了,它的思路是:       從一堆序列中,選擇一個最小的數,作為新的有序序列的頭,剩下的元素依次重複這一過程。 核心程式碼如下: for(int i=0;i<a.length;i++

c#程式碼實現排序演算法選擇排序

選擇排序的平均時間複雜度為O(n²),最好時間複雜度為O(n²),最壞時間複雜度為O(n²),空間複雜度為O(1),是一種不穩定的演算法。 1.將整個記錄序列劃分為有序區和無序區,初始時有序區為空,無序區含有待排序的所有記錄。 2.在無序區查詢值最小的記錄,將它與無序區的第一個記

排序演算法選擇排序(關鍵詞:資料結構/演算法/排序演算法/選擇排序

假定:有 1 個亂序的數列 nums ,其中有 n 個數。 要求:排好序之後是 從小到大 的順序。 選擇排序演算法 程式碼 from swap import swap def select_sort(nums): n = len(nums) i = 0 while

PHP排序演算法選擇排序

二、選擇排序   原理: 在一列數字中,選出最小數與第一個位置的數交換。然後在剩下的數當中再找最小的與第二個位置的數交換,如此迴圈到倒數第二個數和最後一個數比較為止。(以下都是升序排列,即從小到大排列)   舉例說明: $arr = array(6, 3, 8, 2, 9, 1);   第一輪:   

排序演算法選擇排序演算法【java實現】

簡介:遍歷陣列,每次選出最小的數與索引第一個進行交換,直到全部完成。 package zhgyu.sort; /** /*選擇排序演算法 * @author zhgyu * */ public class SelectionSort { static final int SIZE =

十大經典排序演算法選擇排序(Selection Sort)

選擇排序(Selection-sort)是一種簡單直觀的排序演算法。 它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。  2.1 演算法描

java基本排序演算法選擇排序插入排序

一.選擇排序 一種簡單直觀的排序演算法,特點是效率低,容易實現,速度較氣泡排序快。 思想:遍歷,每一趟從待排序的序列裡取出一個最小的數排在排好序的序列裡面,剩下的重複上述步驟直到排完。 比較簡單直接貼程式碼: public static void xuanze(int

排序演算法-選擇排序

假定arr是一個具有n=5個元素的整數陣列{50,20,40,75,35} 遍0:選擇索引1處的整數20,交換arr[1]和arr[0]中的元素 遍1:選擇索引4處的整數35,交換arr[4]和arr[1]中的元素 遍2:選擇索引2處的整數40,交換arr[2]和arr[2]中的元素

九大排序演算法選擇排序(原理及實現)

1、演算法思想:選擇排序,從頭至尾掃描序列,找出最小的一個元素,和第一個元素交換,接著從剩下的元素中繼續這種選擇和交換方式,最終得到一個有序序列。 2、演算法過程 舉個栗子(第一趟的排序過程) 原始序列:49、38、65、97、76、13、27、49 1)在進行選擇排

資料結構-排序演算法選擇排序

選擇排序 一、基本演算法思想 從第i趟中排序序列,序列後的n-i+1個元素中選擇一個最小j的元素,與該n-i+1進行交換,每一趟都是從未排好的序列中進行選擇一個最小的元素與未排好序列的第一個元素進行交換。 二、例如 有這樣一個元素序列1,34,56,7,54,63,5

Java常見排序演算法選擇排序詳解

一、簡介 選擇排序,就是每一趟從待排序的序列中選出最小的元素,順序放在已排好序的序列最後,直到全部序列排序完畢。簡單理解就是假設一個最小值,將剩餘的未排序的序列與假設的最小值進行比較,如果發現比假設的最小值還小的值,那麼將它與假設的最小值調換位置。 二、排序思路 排序思

八大排序演算法選擇排序

選擇排序—簡單選擇排序(Simple Selection Sort) 此文章前半部分--》》簡單選擇排序是另一位大哥寫的部落格:http://blog.csdn.net/hguisu/article/details/7776068 但是我這想要說的是後半部分雙向選擇排序,

排序演算法選擇排序

選擇排序 最近在看《演算法導論》,半路出家的我看的著實頭痛,先記錄下心得,難得的好書。 PS:看不懂的書才是好書

排序演算法選擇排序——C++實現

對於直接選擇排序演算法,是給每個位置選擇當前元素最小的,比如給第一個位置選擇最小的,在剩餘元素裡面給第二個元素選擇第二小的,依次類推,直到第n-1個元素,第n個 元素不用選擇了,因為只剩下它一個最大的元素了。那麼,在一趟選擇,如果當前元素比一個元素小,而該小的元素又出現在一個和當前元素相等的元素後面,那麼

排序演算法選擇排序演算法

選擇排序演算法是一種基礎的排序演算法。它的基本原理如下: 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後再從剩餘未排序元素中繼續尋找最小(大)元素。放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。 程式碼實現: d

C#實現——十大排序演算法選擇排序

# 選擇排序法 ## 1.工作原理(演算法思路) 1. 給定一個待排序陣列,找到陣列中最小的那個元素 2. 如果最小元素不是待排序陣列的第一個元素,則將其和第一個元素互換 3. 在剩下的元素中,重複1、2過程,直到排序完成。 ## 2.動圖演示 ![選擇排序法 動圖](https://img202

排序演算法 插入排序、希爾(shell)排序 及其時間複雜空間複雜

        有一個已經有序的資料序列,要求在這個已經排好的資料序列中插入一個數,但要求插入後此資料序列仍然有序,這個時候就要用到一種新的排序方法——插入排序插入排序的基本操作就是將一個數據插入到已經排好序的有序資料中,從而得到一個新的、個數加一的有序資料,演算法適用於少

排序演算法 歸併排序 及其時間複雜空間複雜

        在排序演算法中快速排序的效率是非常高的,但是還有種排序演算法的效率可以與之媲美,那就是歸併排序;歸併排序和快速排序有那麼點異曲同工之妙,快速排序:是先把陣列粗略的排序成兩個子陣列,然後遞迴再粗略分兩個子陣列,直到子數組裡面只有一個元素,那麼就自然排好序了,可