排序(二):選擇排序法
前言:有時候,我會覺得,凡事只要有個目標,便可以朝著它努力,這樣必定會有結果;可是,慢慢的我發現,在生活中,太多的我們追求的事情,是沒有目標的,這也正是我現階段困惑的東西,我只能一步步的去試探,試圖發現個規律。
雖然沒有明確的目標,但是我還是要繼續加油,對吧?
基本思想:
在排序的一組數中,選出最小的數與第一個數互換,如果本身就是則保持原位,接著再重剩下的數中選出最小的數與第二個數互換,直到最後兩個數為止。
大概流程圖如圖所示:
java程式碼實現:
import java.util.Scanner;
public class SelectSort {
public static void main(String[] args) {
int[] numbers = new int[5];
Scanner scanner = new Scanner(System.in);
for(int i=0;i<numbers.length;i++){
numbers[i] = scanner.nextInt();
}
selectSort(numbers);
for(int j =0;j<numbers.length;j++){
System.out .print(numbers[j]+",");
}
}
public static void selectSort(int[] numbers){
int size = numbers.length;
int temp = 0;
for(int i =0;i<size-1;i++){
int k = i;
for(int j=size-1;j>i;j--){
if(numbers[j]<numbers[k]){
k = j;
}
}
temp = numbers[i];
numbers[i] = numbers[k];
numbers[k]= temp;
}
}
}
舉例執行:
輸入:9,4,8,3,6
輸出:3,4,6,8,9
時間複雜度O(n*n) 效能上優於氣泡排序 交換次數少
因為氣泡排序法每次迴圈都要判斷是否較大(較小)然後進行交換,而選擇排序法則只需選中最小的數與第一個數進行交換,迴圈下去,所以節省了許多交換次數。
我們可以看下有人做出的時間計算資料:
從圖中我們可以看出:當陣列長度到達一定數目,氣泡排序的效能明顯低於選擇排序。
相關推薦
排序(二):選擇排序法
前言:有時候,我會覺得,凡事只要有個目標,便可以朝著它努力,這樣必定會有結果;可是,慢慢的我發現,在生活中,太多的我們追求的事情,是沒有目標的,這也正是我現階段困惑的東西,我只能一步步的去試探,試圖發現
經典演算法(二):選擇排序
昨天我們學習了經典中的經典,氣泡排序,今天我們來學習另一個經典演算法:選擇排序。 一、演算法描述 掃描所有的元素,得到最小(最大·)的元素,並將最小(最大)的元素與左邊第一個元素進行交換。再掃描除第一個位置以外的所有元素,得到最小(最大)元素,與左邊第二
排序(一):選擇排序
一、步驟 1、找到陣列中的最小元素; 2、將第一步找到的最小元素與陣列第一個元素交換位置(如果第一個元素就是最小元素則和自己交換); 3、在剩下的元素中找到最小元素,將它與第二個元素交換位置。如此
八大排序(二):歸併排序
歸併排序(MERGE-SORT)是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。分治法即將問題分(divide)成一些小的問題然後遞迴求解,而治(conquer)的階段則將分的階段得
算法(二) 簡單選擇排序
簡單選擇排序從左到右依次選取一個值作為默認最大值,依次與其它值比較,如果有值比該值大,那最大值指針改指向該值,一輪比較完成後,如果最大值指針沒有變化,則從下一個值繼續下一輪比較,如果指針有變動,則最新指針位置的數值與初始指針位置數值交換位置。代碼如下:lst1 = [ [1, 8, 9, 5, 6,
[Swift]八大排序算法(二):快速排序
addition 每次 數據交換 uri 基本思想 技術分享 繼續 splay 休眠 排序分為內部排序和外部排序。 內部排序:是指待排序列完全存放在內存中所進行的排序過程,適合不太大的元素序列。 外部排序:指的是大文件的排序,即待排序的記錄存儲在外存儲器上,待排序的文件
Java常用的八種排序演算法與程式碼實現(二):歸併排序法、快速排序法
注:這裡給出的程式碼方案都是通過遞迴完成的 --- 歸併排序(Merge Sort): 分而治之,遞迴實現 如果需要排序一個數組,我們先把陣列從中間分成前後兩部分,然後對前後兩部分進行分別排序,再將排好序的數組合並在一起,這樣整個陣列就有序了 歸併排序是穩定的排序演算法,時間
Java並發(二):重排序
技術分享 安排 通過 mage 種類 操作 處理器 加載 str 在執行程序時為了提高性能,提高並行度,編譯器和處理器常常會對指令做重排序。重排序分三種類型: 編譯器優化的重排序。編譯器在不改變單線程程序語義的前提下,可以重新安排語句的執行順序。 指令級並行的重排序。現代
排序(上):氣泡排序、插入排序和選擇排序
如何分析一個排序演算法? 分析一個排序演算法的三要素:排序演算法的執行效率、排序演算法的記憶體消耗以及排序演算法的穩定性。 排序演算法的執行效率 對於排序演算法執行效率的分析,一般是從以下三個方面來衡量: 最好情況、最壞情況、平均情況時間複雜度 時間複雜度的係數、常數、低階 比較次數和交
排序(上):冒泡排序、插入排序和選擇排序
最壞情況 選擇排序 main 評價 先後 序列 emp 復雜度 基本思想 如何分析一個排序算法? 分析一個排序算法的三要素:排序算法的執行效率、排序算法的內存消耗以及排序算法的穩定性。 排序算法的執行效率 對於排序算法執行效率的分析,一般是從以下三個方面來衡量: 最好情況
演算法訓練營(二):堆排序
堆排序過程 建立大頂堆或者小頂堆,大頂堆(一種二叉樹型結構,子樹節點值都小於父節點的值)。這個過程的要點是:先從最後一個非葉子節點開始構建堆,因為最後一個非葉子節點才有可能需要調整,然後向前查詢的節點都有子樹,都有可能需要調整。 排序過程。建立好了大頂堆,那麼第一個節
演算法(二):氣泡排序
氣泡排序(Bubble Sort),是一種電腦科學領域的較簡單的排序演算法。 它重複的走訪過要排列的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來,走訪數列的工作是重複的進行直到沒有有再需要交換,也就是說該數列已經排序完成。 這個演算法的名字由來是因為越大的元素會
演算法快學筆記(三):選擇排序的原理與實現
1. 原理介紹 選擇排序是個簡單的排序,思路主要通過多次遍歷待排序的集合,每次彈出最大/小值並放入新的集合,直到原始集合為空。舉個例子: 假設要對A=[1,2,5,9,3]按照升序的方式進行排序,步驟與結果如下 從A中找出最大值,將其pop,並放入B中,執行後的結果如下:
array和list排序演算法對比(二):歸併排序
接著上一篇文章,這裡簡單討論陣列和連結串列的歸併排序在演算法設計上的區別。 歸併排序的特點是採用二分的策略,將陣列的子陣列進行排序,然後將兩個有序的子數組合併成一個大的有序陣列。如果採用陣列結構,二分是非常簡單的操作,但二分後的合併空間開銷相對較大。如果採用連
基本排序(三):插入排序 和 希爾排序- 從後向前掃描,比正操作元素大的逐步移位
1. 插入排序 插入排序(Insertion Sort)工作原理(維基百科) 通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃描,找到相應位置插入。插入排序實現上,通常採用in-place排序(即只需用到O(1)的額外空間的排序),因而在從後向
Java排序算法分析與實現:快排、冒泡排序、選擇排序、插入排序、歸並排序(二)
第一個元素 spa insert 循環 冒泡排序 author 高級算法 ins -s 一、概述: 上篇博客介紹了常見簡單算法:冒泡排序、選擇排序和插入排序。本文介紹高級排序算法:快速排序和歸並排序。在開始介紹算法之前,首先介紹高級算法所需要的基礎知識:劃分、遞歸,並順
Java常用的八種排序演算法與程式碼實現(一):氣泡排序法、插入排序法、選擇排序法
這三種排序演算法適合小規模資料排序 --- 共同點:基於比較,時間複雜度均為O(n2),空間複雜度均為O(1)(原地排序演算法) 不同點:插入排序和氣泡排序是穩定的排序演算法,選擇排序不是 --- 穩定排序演算法:可以保持數值相等的兩個物件,在排序之
編程題#3:奇偶排序(二)
log cnblogs 保存 比較 如果 () return names space #include <iostream> using namespace std; int main() { int n, a[1000]; // 一共n個數,n不超過
算法(三)二元選擇排序
二元選擇排序二元選擇排序在簡單選擇排序的基礎上,一輪中同時比較出最大值與最小值lst1 = [ [1, 8, 9, 5, 6, 7, 4, 3, 2], [9, 8, 7, 6, 5, 4, 3, 2, 1], [1, 2, 3, 4, 5, 6, 7, 8, 9], [1,
[數據結構(二)]七種排序算法的C++簡單實現
末尾 技術分享 下標 ima http 直接 wap temp 部分 一.冒泡排序(Bubble Sort) 基本思想:兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序的記錄為止。 //冒泡排序 void BubbleSort(int *p, int lengt