排序: 選擇排序

1. 基本原理

將待排序的元素分為已排序(初始為空)和未排序兩組,依次將未排序的元素中值最小的元素放入已排序的組中。

?

直接選擇排序簡單直觀,但性能略差;堆排序是一種較高效的選擇排序方法,但實現起來略微復雜。

?

2. 直接選擇排序

基本過程為:

  • 在一組元素R[i]到R[n]中選擇具有最小關鍵碼的元素
  • 若它不是這組元素中的第一個元素,則將它與這組元素中的第一個元素對調。
  • 除去具有最小關鍵字的元素,在剩下的元素中重復第(1)、(2)步,直到剩余元素只有一個為止。

?

?

3. 代碼實現

  1 package com.windy.sort;
  2 
  3 import java.util.Arrays;
  4 
  5 import org.junit.Test;
  6 
  7 public class SelectSort {
  8 
  9     class DataWrap implements Comparable<DataWrap> {
 10         int data;
 11         String flag;
 12 
 13         public DataWrap(int data, String flag) {
 14             this.data = data;
 15             this.flag = flag;
 16         }
 17 
 18         @Override
 19         public String toString() {
 20             return data + flag;
 21         }
 22 
 23         @Override
 24         public int compareTo(DataWrap dw) {
 25 
 26             return this.data > dw.data ? 1 : (this.data == dw.data ? 0 : -1);
 27 
 28         }
 29     }
 30 
 31     @Test
 32     public void test1() {
 33 
 34         DataWrap[] dw = new DataWrap[] { 
 35                 new DataWrap(-9, ""), 
 36                 new DataWrap(1, ""),
 37                 new DataWrap(-47, "*"),
 38                 new DataWrap(1246, ""), 
 39                 new DataWrap(758, ""), 
 40                 new DataWrap(-123, ""), 
 41                 new DataWrap(5, ""),
 42                 new DataWrap(638, ""), 
 43                 new DataWrap(-47, ""), 
 44                 new DataWrap(5, "*")
 45                 };
 46 
 47         System.out.println("排序前:\n" + Arrays.toString(dw));
 48         selectSort(dw);
 49         System.out.println("排序后:\n" + Arrays.toString(dw));
 50     }
 51 
 52     @Test
 53     public void test2() {
 54         DataWrap[] dw = new DataWrap[] { 
 55                 new DataWrap(-9, ""), 
 56                 new DataWrap(1, ""),
 57                 new DataWrap(-47, "*"),
 58                 new DataWrap(1246, ""), 
 59                 new DataWrap(758, ""), 
 60                 new DataWrap(-123, ""), 
 61                 new DataWrap(5, ""),
 62                 new DataWrap(638, ""), 
 63                 new DataWrap(-47, ""), 
 64                 new DataWrap(5, "*")
 65                 };
 66 
 67         System.out.println("排序前:\n" + Arrays.toString(dw));
 68         selectSort2(dw);
 69         System.out.println("排序后:\n" + Arrays.toString(dw));
 70     }
 71 
 72     // 直接選擇排序
 73     private static void selectSort(DataWrap[] dw) {
 74 
 75         int length = dw.length;
 76 
 77         System.out.println("排序中...");
 78 
 79         for (int i = 0; i < length - 1; i++) {
 80 
 81             for (int j = i + 1; j < length; j++) {
 82                 if (dw[i].compareTo(dw[j]) > 0) {
 83                     DataWrap temp;
 84                     temp = dw[i];
 85                     dw[i] = dw[j];
 86                     dw[j] = temp;
 87                 }
 88             }
 89 
 90             System.out.println(Arrays.toString(dw));
 91         }
 92 
 93     }
 94 
 95     /*
 96      * 直接選擇排序改進版 用臨時變量記錄最小值的下標,而不是選擇馬上交換 在對比一輪結束之后,才選擇交換
 97      */
 98     private static void selectSort2(DataWrap[] dw) {
 99         int length = dw.length;
100 
101         System.out.println("排序中...");
102         for (int i = 0; i < length - 1; i++) {
103             int min = i;
104 
105             for (int j = i + 1; j < length; j++) {
106                 // 用最小值去對比,而不是dw[i]
107                 if (dw[min].compareTo(dw[j]) > 0) {
108                     min = j;
109                 }
110             }
111 
112             DataWrap temp;
113             temp = dw[i];
114             dw[i] = dw[min];
115             dw[min] = temp;
116 
117             System.out.println(Arrays.toString(dw));
118         }
119 
120     }
121 
122 }
View Code

?

結果打印:

排序前:
[-9, 1, -47*, 1246, 758, -123, 5, 638, -47, 5*]
排序中...
[-123, 1, -9, 1246, 758, -47*, 5, 638, -47, 5*]
[-123, -47*, 1, 1246, 758, -9, 5, 638, -47, 5*]
[-123, -47*, -47, 1246, 758, 1, 5, 638, -9, 5*]
[-123, -47*, -47, -9, 1246, 758, 5, 638, 1, 5*]
[-123, -47*, -47, -9, 1, 1246, 758, 638, 5, 5*]
[-123, -47*, -47, -9, 1, 5, 1246, 758, 638, 5*]
[-123, -47*, -47, -9, 1, 5, 5*, 1246, 758, 638]
[-123, -47*, -47, -9, 1, 5, 5*, 638, 1246, 758]
[-123, -47*, -47, -9, 1, 5, 5*, 638, 758, 1246]
排序后:
[-123, -47*, -47, -9, 1, 5, 5*, 638, 758, 1246]

?

4. 算法效率分析

  • 算法的時間效率:無論初始狀態如何,在第i趟排序中選擇最小關鍵碼的元素,需做n-i次比較,因此總的比較次數為:

? ? ? ??

?

  • 算法的空間效率:空間效率很高,只需要一個附加程序單元用于交換,其空間效率為O(1)

?

  • 算法的穩定性:不穩定

轉載于:https://www.cnblogs.com/fengze/p/6608138.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253051.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253051.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253051.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JavaScript的值傳遞和引用傳遞

原文: Explaining Value vs. Reference in Javascript譯者: Fundebug為了保證可讀性&#xff0c;本文采用意譯而非直譯。另外&#xff0c;本文版權歸原作者所有&#xff0c;翻譯僅用于學習。 JavaScript有5種基本的數據類型&#xff0c;分別是&#xff1a;布爾、null、undefine…

全景攝像技術大有可為

網絡攝像機發展至今&#xff0c;已經基本滿足了“高清”、“日夜監控”、“遠距離監控”的需求&#xff0c;但是 隨著細分市場的發展&#xff0c;超廣角攝像機需求逐漸凸顯出來。主要應用在會議室、辦公室、大廳/大堂、商場、倉庫、車間等大面積開闊的區域&#xff0c;解決原來…

C#編程(五十三)----------字典DictionaryTKey,TValue

字典 關鍵字:Dicitionary 說明: 必須包含命名空間System.Collection.Generic Dictionary里面的每一個元素都是一個鍵值對(由兩個元組組成:鍵和值). 鍵必須是唯一的,而值不需要唯一的. 鍵和值都可以是任意類型(例如:string,int,自定義類型,等等) 通過一個鍵讀取一個值的事件是接…

setInterval只執行一次的原因

1 setInterval(arrow(),2000) 改為&#xff1a; 1 setInterval(arrow,2000) 原因&#xff1a; arrow()這是一個函數調用&#xff0c;函數調用就會有返回值&#xff0c; 而arrow()沒有返回值&#xff0c;所以這里的arrow()是一個undefined&#xff0c;自然你想要的循環執行arrow…

java文件傳輸之文件編碼和File類的使用

---恢復內容開始--- 我們知道&#xff0c;在用戶端和服務端之間存在一個數據傳輸的問題&#xff0c;例如下載個電影、上傳個照片、發一條訊息。在這里我們 就說一下文件的傳輸。 1.文件編碼 相信大家小時候玩過積木&#xff08;沒玩過也看過吧&#xff09;&#xff0c;看到一個…

Android 模擬輸入那點事

因工作原因&#xff0c;需要用到模擬輸入這個東東&#xff0c;查閱了一些資料&#xff0c;實現方式有多種&#xff0c;我大概分為兩類&#xff0c;命令行類和程序類。 命令行類包括自動化測試組件monkeyrunner&#xff0c;getevent/setevent命令&#xff0c;input命令 程序類包…

arm-linux-gcc:Command not found的問題

標簽&#xff1a; ubuntulinux 2015-05-15 10:47 680人閱讀 評論(0) 收藏 舉報 分類&#xff1a; Ubuntu&#xff08;23&#xff09; /etc/profile gcc&#xff08;9&#xff09; ARM匯編指令&#xff08;4&#xff09; 折騰了一天&#xff0c;終于搞定了。 ubuntu沒有roo…

[No0000111]java9環境變量配置bat

保存成bat&#xff08;utf-8 無簽名 編碼&#xff09; 右鍵以管理員權限運行 修改JAVAINSTALLPATH 為JAVA SDK 安裝目錄&#xff08;默認用C:\PROGRAM FILES\JAVA\&#xff09;即可&#xff1b; 只在 用戶變量下 創建&#xff0c;會事先保存好用戶原有的“JAVA_HOME,JRE_HOME,P…

去掉浮夸,空杯心態重新面對測試

剛開始一頭扎進軟件測試行業&#xff0c;從踏踏實實的機械化功能測試&#xff0c;到學會和甲方扯皮&#xff0c;到被鄙視的五體投地后抓緊修煉表面功夫來忽悠人&#xff0c;學的最多的反而是怎么與人交流。第一次面對跳槽的機會&#xff0c;我竟然發現自己的測試能力不升反降。…

PASTE Splay

題目描述 我們用文本處理器來處理一個特殊的文本文件&#xff0c;該文本文件共有N行文本&#xff0c;每一行文本僅包含一個自然數&#xff0c;第一行為1、第二行為2&#xff0c;以此類推至N行為自然數N。   假設對該文本文件執行一次“剪切和粘貼”操作含義如下&#xff1a;…

linux 用戶空間通過makefile向程序傳遞參數

一. 用戶空間 因為實際上進行預處理的只是Gcc工具&#xff0c;而make工具只是一個解決依賴關系的工具。所以問題就簡化成如何通過make向gcc傳遞參數。通過簡單的例子來說明&#xff1a;hello.c#include <stdio.h> void main(void) {#ifdef DEBUG printf("y…

Spring---基于Spring IOC的小程序

實現的功能以及各文件間的關系 IHelloMessage&#xff1a;一個接口&#xff0c;用于定義輸出問候信息。 HelloWorld、HelloChina&#xff1a;接口的實現類。在這里表示人在不同的地方 Person&#xff1a;一個人物類&#xff0c;調用IHelloMessage接口&#xff0c;向用戶輸出問候…

Web開發者不可不知的16條原則

HTML已經走過了近20的發展歷程。從HTML4到XHTML&#xff0c;再到最近十分火熱的HTML5&#xff0c;它幾乎見證了整個互聯網的發展。但是&#xff0c;即便到現在&#xff0c;有很多基礎的概念和原則依然需要開發者高度注意。下面&#xff0c;小編向大家介紹這些應該遵循的開發原則…

MIPI DSI協議介紹

原文地址&#xff1a;http://blog.csdn .NET/qq160816/article/details/19555957 一、MIPI MIPI&#xff08;移動行業處理器接口&#xff09;是Mobile Industry Processor Interface的縮寫。MIPI&#xff08;移動行業處理器接口&#xff09;是MIPI聯盟發起的為移動應用處理器制…

NSArray、NSDictionary、NSString存儲、刪改、遍歷

NSString 創建一個NSString實例&#xff1a;NSString *str “this is string”;//字面量語法 常用API&#xff1a; stringWithFormat //創建動態字符串 -&#xff08;NSUInteger&#xff09;length //獲取字符的數量 -isEqualToString: //判斷兩個字符串是否相等 -uppercaseSt…

2018.11.14成立我的博客

2018.11.14成立我的博客轉載于:https://www.cnblogs.com/zengxx/p/9957509.html

130242014018-鄭志良-第2次實驗

一、實驗目的 1&#xff0e;熟悉體系結構的風格的概念 2&#xff0e;理解和應用管道過濾器型的風格。 3、理解解釋器的原理 4、理解編譯器模型 二、實驗環境 硬件&#xff1a; 軟件&#xff1a;Python或任何一種自己喜歡的語言 三、實驗內容 1、實現“四則運算”的簡易翻譯器。…

Hi3516A開發--掛載SD卡和U盤

一、SD卡 1、通過fdisk -l命令確認板子上的Linux系統是否識別SD卡 / # fdisk -l Disk /dev/mmcblk0: 63.8 GB, 63864569856 bytes 255 heads, 63 sectors/track, 7764 cylinders Units cylinders of 16065 * 512 8225280 bytes Device Boot Start …

【BZOJ 4170】 4170: 極光 (CDQ分治)

4170: 極光 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 121 Solved: 64Description "若是萬一琪露諾&#xff08;俗稱rhl&#xff09;進行攻擊&#xff0c;什么都好&#xff0c;冷靜地回答她的問題來吸引她。對方表現出興趣的話&#xff0c;那就慢慢地反問。在她考…

自動生成web服務器日志解析規則

2019獨角獸企業重金招聘Python工程師標準>>> 當前web服務器的多樣化使得訪問日志的數據清洗變得越來越復雜&#xff0c;企業需要投入專業的數據清洗人員編寫數據清洗規則&#xff08;解析規則或者解析正則&#xff09;&#xff0c;或者需要關心web服務器訪問日志的生…