algorithm -- 選擇排序

選擇排序是《導論》第一章課后習題,仿照插入排序,再次運用循環不變式來證明下算法的正確性,C++ 源碼:

// 交換函數 
void swap( int& a, int& b )
{a = a^b;b = a^b;a = a^b;
}
void selectSort( int *arr, int count )
{if( arr == nullptr || count == 0 ){return;}for( int i = 1; i < count; i++ ){int tem = arr[ i - 1 ];for( int j = i; j < count; j++ ){if( tem > arr[j] ){swap( tem, arr[ j ] );}}arr[ i - 1 ] = tem;}
}

傳入待排序數組指針和數組大小,同樣正在排序的元素前面的是已經排序好的部分,未排序的在后面。

  • 初始化: i = 1; tem = arr[ 0 ]; tem 等于第一個元素,依次和后面的元素比較,如果 tem 大則交換值,這樣到和后面元素比較完后 tem 就是值最小的一個,賦值給 arr[ 0 ]arr[ 0 ] 的原值在比較過程中賦值給后面的第一個小于它的元素,數組本身數據沒有增加或減少。

  • 保持:第 i 個元素排序時前面元素已經按從小到大的順序排好了,依次各后面的元素比較,如果大于后面的元素則交換值,直到比較完全部剩余的元素,這時 tem 就是剩余元素中值最小的一個賦值給 arr[ i - 1 ],0~(i-1)的元素已經排好序了,后面的則是無序的

  • 終止: 當 i == count 時,循環條件不滿足,跳出循環,此時 數組的前 i-1 個已排好順序,而數組大小為 conut 個,數組最后一個元素的下標是 conut-1 等于此時的 i-1 ,所以此時數組已排好序了,算法正確。

循環不變式 的證明結束了,需要說明的一點是上面的交換函數:

// 交換函數 
void swap( int& a, int& b )
{a = a^b;b = a^b;a = a^b;
}

函數參數使用引用,可以修改參數原來的值,引用在 C++ 中是變量別名,即同一個變量可以有多個名字,區別定義是名字,其他的別名叫引用,引用可以像變量本身一樣對數值操作,作為函數參數時,可以在函數內部修改變量;普通的函數參數,會將傳遞過來變量拷貝一份,在函數內部的修改不到影響外部變量的值。

函數內部使用 ^ 異或來交換值,異或是 運算符,位運算比一般的運算要快;異或有個特殊的性質,連續兩次異或變量的值不會變,即第一次異或會變成奇怪的值,再次異或就會變成原值,這個交換函數就是利用這個性質,

  • a b 異或賦值 a, a是異或后的結果
  • a b 再次異或結果為原來的 a, 賦值 b,交換一個
  • a b(原a值)異或結果為原來的 b 賦值 a,交換完成

實踐兩次 循環不變式 下次嘗試算法分析!

algorithm wiki GitHub

轉載于:https://www.cnblogs.com/pythian/p/4729138.html

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

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

相關文章

OD 完美走位

題目描述&#xff1a; 在第一人稱射擊游戲中&#xff0c;玩家通過鍵盤的A、S、D、W四個按鍵控制游戲人物分別向左、向后、向右、向前進行移動&#xff0c;從而完成走位。假設玩家每按動一次鍵盤&#xff0c;游戲人物會向某個方向移動一步&#xff0c;如果玩家在操作一定次數的鍵…

layui upload 后臺獲取不到值

后臺獲取不到值方法一&#xff1a; <script>layui.use(upload, function () {var upload layui.upload;//執行實例var uploadInst upload.render({elem: #test1 //綁定元素, url: /Home/UploadFiles //上傳接口, field: "fileNames" //添加這個屬性與后臺…

ueeditor無法上傳圖片_百度ue文本編輯器開發中無法上傳圖片

第一次發文&#xff0c;好緊張呀&#xff0c;不知道會不會沒人看。之前用ue遇到了一些坑&#xff0c;沒人看就當自己記錄了筆記。第一次用&#xff0c;總是會遇到問題&#xff0c;可以先查看下百度ue的演示http://ueditor.baidu.com/website/onlinedemo.html和API http://fex.b…

SQL 語句優化--IN語句優化案例

為什么80%的碼農都做不了架構師&#xff1f;>>> 今天客戶系統升級&#xff0c;通過DMVs性能分析查了一下&#xff0c;升級后發現一個語句執行時間比較長&#xff0c;執行語句要好幾秒鐘&#xff0c;調出語句如下&#xff1a; select distinct field003 from ufi2j0…

Activity跳轉

本例中MainActivity為&#xff1a;FirstActivity.java FirstActivity如下&#xff1a; package com.wyl.intentmultiactivitytest;import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.Vie…

Java課程設計---項目數據庫設計(含實體類)

1、數據庫分析設計 將數據庫命名為&#xff1a;db_student 分析系統中各角色之間的關系 2、表設計 &#xff08;1&#xff09;新建表tb_student&#xff08;學生表&#xff09; &#xff08;2&#xff09;新建表tb_admin&#xff08;管理員表&#xff09; &#xff08;3&#x…

java)_Java NIO系列教程(一) Java NIO 概述

原文鏈接 作者&#xff1a;Jakob Jenkov 譯者&#xff1a;airu 校對&#xff1a;丁一Java NIO 由以下幾個核心部分組成&#xff1a;ChannelsBuffersSelectors雖然Java NIO 中除此之外還有很多類和組件&#xff0c;但在我看來&#xff0c;Channel&#xff0c;Buffer…

本地讀取服務器Xml文件及本地讀本地的xml

updateUrl"ServerUrl"(服務器路徑) WebClient wc new WebClient(); Stream stream wc.OpenRead(updateUrl); XmlDocument xmlDoc new XmlDocument(); xmlDoc.Load(stream); XmlNode list xmlDoc.SelectSingleNode("Update"); foreach (XmlNode node in…

Context.getExternalFilesDir()和Context.getExternalCacheDir()方法

2019獨角獸企業重金招聘Python工程師標準>>> Context.getExternalCacheDir()方法可以獲取到 SDCard/Android/data/你的應用包名/cache/目錄&#xff0c;一般存放臨時緩存數據如果使用上面的方法&#xff0c;當你的應用在被用戶卸載后&#xff0c;SDCard/Android/dat…

java 靜態代碼塊_JAVA靜態代碼塊

今天遇到下面的代碼&#xff0c;感覺很奇怪&#xff0c;特意記錄下&#xff1a;代碼如下&#xff1a;public class Test {private static List objs new ArrayList();static {objs.add(new Test(Test.S_NAME,Test.NAME,Test.COUNT));objs.add(new Test(Test.S_NAME,Test.NAME,…

context詳解

1、Context概念&#xff1a; Context&#xff0c;相信不管是第一天開發Android&#xff0c;還是開發Android的各種老鳥&#xff0c;對于Context的使用一定不陌生~~你在加載資源、啟動一個新的Activity、獲取系統服務、獲取內部文件&#xff08;夾&#xff09;路徑、創建View操作…

Unity Camera的兩種模式

http://www.cnblogs.com/zhaoqingqing/p/3302484.html

mysql之group_concat函數

mysql之group_concat函數 在介紹GROUP_CONCAT之前&#xff0c;我們先來看看concat()函數和concat_ws()函數。 先準備一個測試數據庫&#xff1a; mysql> select * from scores; --------------------- | id | name | score | --------------------- | 1 | zhangsan | 1…

java 圖片批量上傳_java實現批量上傳圖片,還要保證每個圖片的順序號,疑問求教!...

rt我要一次性同時上傳n張照片&#xff0c;并且每張照片的順序號還不一樣&#xff0c;第一張的serialno是1&#xff0c;第二張是2。。一開始我做單張圖片上傳&#xff0c;代碼如下RequestMapping("/picUpLoad")ResponseBodypublic Map picUpLoad(MultipartFile file, …

linux 用戶創建、管理、權限分配

&#xff08;1&#xff09;su與sudo su:通過su可以在用戶之間切換&#xff0c;如果超級權限用戶root向普通或虛擬用戶切換不需要密碼&#xff0c;什么是權力&#xff1f;這就是&#xff01;而普通用戶切換到其它任何用戶都需要密碼驗證&#xff1b; sudo: sudo扮演的角色注定了…

WebApi路由

路由分為兩種模式&#xff1a;模板路由和特性路由。 模板路由&#xff1a; 模板路由是ASP.NET Web API默認提供的路由。模板路由使用前需要定義路由模板。如下面默認的路由模板&#xff1a; 默認路由的URL格式是api/{controller}/{id}。api代表在資源前面要帶上api目錄&#xf…

HW--漂亮度2(測試通過)

總結&#xff1a;幾個函數的使用 &#xff08;1&#xff09; int numInteger.parseInt(str[0]); //將第一個字符串轉成整形數&#xff0c;表示名字個數 &#xff08;2&#xff09; String string1str[i].toLowerCase(); //變小寫都 &#xff08;3&#xff09; char ch[]strin…

java設計模式 組合_JAVA 設計模式 組合模式

用途組合模式 (Component)將對象組合成樹形結構以表示“部分-整體”的層次結構。組合模式使得用戶對單個對象和組合對象的使用具有唯一性。組合模式是一種結構型模式。結構圖-組合模式結構圖Component: 組合中的對象聲明接口&#xff0c;在適當的情況下&#xff0c;實現所有類共…

項目總結SpringMVC相關

流程文字概述1、用戶發送請求至前端控制器DispatcherServlet2、DispatcherServlet收到請求調用HandlerMapping處理器映射器。3、處理器映射器找到具體的處理器&#xff0c;生成處理器對象及處理器攔截器(如果有則生成)一并返回給DispatcherServlet。4、DispatcherServlet調用Ha…

SpringBoot登錄登出切面開發

閱讀本文約“2.5分鐘” 本文開發環境是SpringBoot2.X版本。 對于系統而言&#xff08;這里多指管理系統或部分具備登錄登出功能的系統&#xff09;&#xff0c;登錄登出是一個類權限驗證的過程&#xff0c;現在一般是以token進行校驗&#xff0c;即用戶輸入登錄信息&#xff0c…