1_插入排序_循環不變式

01_插入排序

#include<stdio.h>void insert_sort(int arr[], int n);
void printArray(int arr[], size);int main()
{int arr[] = {1, 2, 3, 22, 5, 9};int n = sizeof(arr) / sizeof(arr[0]);printf("打印原始數組:\n");prinfArray(arr, n);insert_sort(arr, n);printf("打印排序后的數組: \n");
}void insert_sort(int arr[], int n)
{int i, key, j;for(i = 1; i < n; i++){key = arr[i];j = i -1;while(j >= 0 && arr[j] > key){arr[j+1]  = arr[j];j = j - 1;}arr[j + 1] = key;}
}void printArrray(int arr[], int size)
{int i;for (i = 0; i < size; i++){printf("%d ", arr[i]);}printf("\n");
}

分析

notion

循環不變式:

循環不變式是在每次循環迭代開始時都保持為真的條件。通過證明循環不變式在每次迭代中都成立,我們可以證明算法在終止時得到正確的結果

  1. 初始化:

    循環的第一次迭代之前,不變式成立。這通常是在進入循環之前的一些初始條件或初始化步驟

  2. 保持:

    證明如果在某次迭代開始時不變式成立,那么在這次迭代結束后仍然成立。這涉及證明循環體的執行不會破壞不變式

  3. 終止:

    證明當循環終止時,不變式結合循環終止條件能推出算法的正確性。也就是說,不變式和終止條件共同表明算法已經得到了正確的結果

插入排序中的循環不變式

  1. 初始化:

    在第一次迭代中,子數組arr[0]只包含一個元素,它顯然是已排序的。因此,循環不變式在循環開始前成立

  2. 保持:

    假設某次迭代開始,子數組arr[0, … i-1]是已經排序的(即不變式成立);

    那么然后在這次迭代中,算法會將arr[i]插入到已排序的子數組arr[0, … i-1]中,使得子數組arr[0, … i]依舊是已經排序的;

    通過內部的while循環,算法會找到適當的位置插入arr[i], 并保持已經排序部分的順序不變,因此,在這次迭代結束后,子數組arr[0, …i]是已經排序的(即循環不變式依舊保持);

  3. 終止:

    當循環終止時,‘i’ 達到了’n’, 即整個數組arr[0, … n-1]都是已拍尋的。此時,循環不變式結合終止條件表明整個數組是已排序的,從而證明算法的正確性

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

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

相關文章

湖北大學2024年成人高考函授報名專升本市場營銷專業介紹

在璀璨的學術殿堂中&#xff0c;湖北大學如同一顆璀璨的明珠&#xff0c;熠熠生輝。為了滿足廣大社會人士對于繼續深造、提升自我、實現職業夢想的渴望&#xff0c;湖北大學特別開設了成人高等繼續教育項目&#xff0c;為廣大有志之士敞開了一扇通往知識殿堂的大門。 而今&…

【FFmpeg】av_write_frame函數

目錄 1.av_write_frame1.1 寫入pkt&#xff08;write_packets_common&#xff09;1.1.1 檢查pkt的信息&#xff08;check_packet&#xff09;1.1.2 準備輸入的pkt&#xff08;prepare_input_packet&#xff09;1.1.3 檢查碼流&#xff08;check_bitstream&#xff09;1.1.4 寫入…

【創建者模式-建造者模式】

概要 將一個復雜對象的構建與表示分離&#xff0c;使得同樣的構建過程可以創建不同的表示。 建造者模式包含以下角色 抽象建造者類&#xff08;Builder&#xff09;&#xff1a;這個接口規定要實現復雜對象的那些部分的創建&#xff0c;并不涉及具體的部件對象的創建。具體建…

什么是ISR?

ISR&#xff08;Interrupt Service Routine&#xff0c;中斷服務程序&#xff09;是一個用于處理硬件中斷的特定程序。中斷是硬件或軟件引起的事件&#xff0c;會暫時打斷當前正在運行的任務&#xff0c;以便緊急處理某個事件。ISR的目的是快速響應中斷信號&#xff0c;執行所需…

在WSL Ubuntu中啟用root用戶的SSH服務

在 Ubuntu 中&#xff0c;默認情況下 root 用戶是禁用 SSH 登錄的&#xff0c;這是為了增加系統安全性。 一、修改配置 找到 PermitRootLogin 行&#xff1a;在文件中找到 PermitRootLogin 配置項。默認情況下&#xff0c;它通常被設置為 PermitRootLogin prohibit-password 或…

一篇文章學會【node.js安裝以及Vue-Cli腳手架搭建】

一.為什么搭建Vue-Cli (1).傳統的前端項目結構&#xff1a; 一個項目中有許多html文件&#xff0c;每一個html文件都是相互獨立的&#xff0c; 如果需要在頁面中導入一些外部依賴的組件&#xff0c;就需要在每一個html文件中都需要導入&#xff0c;非常麻煩 (2).現在的前端…

A股低開高走,近3000點,行情要啟動了嗎?

A股低開高走&#xff0c;近3000點&#xff0c;行情要啟動了嗎&#xff1f; 今天的A股&#xff0c;讓人瞪目結舌了&#xff0c;你們知道是為什么嗎&#xff1f;盤面上出現2個重要信號&#xff0c;一起來看看&#xff1a; 1、今天兩市低開高走&#xff0c;銀行板塊護盤指數&…

Windows 下后臺啟動java項目的 jar 包

java -jar swagger.jar 的dos窗口 后臺啟動 jar 包&#xff1a; 使用 javaw.exe 啟動 jar 包&#xff0c;并不會在窗口打印日志&#xff0c;而且會直接在后臺運行進程&#xff0c;關掉窗口&#xff0c;進程繼續跑 javaw -jar swagger.jar 關閉進程&#xff1a; 后臺啟動的 …

大數據面試題之Spark(7)

Spark實現wordcount Spark Streaming怎么實現數據持久化保存? Spark SQL讀取文件&#xff0c;內存不夠使用&#xff0c;如何處理? Spark的lazy體現在哪里? Spark中的并行度等于什么 Spark運行時并行度的設署 Spark SQL的數據傾斜 Spark的exactly-once Spark的RDD和p…

大話C語言:第26篇 靜態庫

1 靜態庫概述 C語言靜態庫&#xff08;Static Library&#xff09;是一種包含一組目標文件的歸檔文件&#xff0c;這些目標文件通常是由多個C語言源文件編譯而成的。靜態庫在程序編譯時被鏈接到目標程序中&#xff0c;成為程序的一部分&#xff0c;因此在運行時不再需要額外的…

java Lambda表達式介紹

Lambda 表達式是 Java 8 中引入的一種語法糖,用于簡化使用函數式接口的代碼編寫。它使得 Java 編程更加簡潔和靈活,特別是在處理集合數據、事件監聽器等方面提供了便利。 Lambda 表達式的語法 Lambda 表達式的基本語法如下: (parameters) -> expression或者是一個代碼…

盤古5.0,靠什么去解最難的題?

文&#xff5c;周效敬 編&#xff5c;王一粟 當大模型的競爭開始拼落地&#xff0c;商業化在B端和C端都展開了自由生長。 在B端&#xff0c;借助云計算向千行萬業扎根&#xff1b;在C端&#xff0c;通過軟件App和智能終端快速迭代。 在華為&#xff0c;這家曾經以通信行業起…

Error: A JNl error has occurred, please check your installation and try again.

Eclipse 運行main方法的時候報錯&#xff1a;Error: A JNl error has occurred, please check your installation and try again. 一、問題分析 導致這個問題&#xff0c;主要原因&#xff0c;我認為是在新版本中&#xff0c;默認的JDK編譯版本與我們配置的JDK版本不一致導致的…

公網環境使用Potplayer遠程訪問家中群暉NAS搭建的WebDAV聽歌看電影

文章目錄 前言1 使用環境要求&#xff1a;2 配置webdav3 測試局域網使用potplayer訪問webdav4 內網穿透&#xff0c;映射至公網5 使用固定地址在potplayer訪問webdav 前言 本文主要介紹如何在Windows設備使用potplayer播放器遠程訪問本地局域網的群暉NAS中的影視資源&#xff…

告別流失,擁抱增長!Xinstall智能邀請系統,讓你的App拉新更高效

在移動互聯網時代&#xff0c;App的推廣和運營面臨著諸多挑戰。其中&#xff0c;如何有效地進行邀請拉新活動&#xff0c;吸引更多新用戶&#xff0c;成為了每個運營者都需要面對的問題。今天&#xff0c;我們將為大家介紹一款能夠幫助你輕松解決這一難題的神器——Xinstall。 …

C語言從頭學28——數組(一)

一、基本概念 數組是一組相同類型的值被順序地儲存在一起。數組表示方法為變量名加方括號&#xff0c;方括號里是數組的成員數量。例如&#xff1a; int arr[20]; //聲明了一個 int 類型的名為 arr 包含20個成員的數組 數組的成員是從0開始編號的&#x…

深入理解Symfony框架的環境配置策略

引言 Symfony是一個高度靈活的PHP框架&#xff0c;它允許開發者通過配置文件來定制應用程序的行為&#xff0c;以適應不同的運行環境。環境配置是Symfony中一個重要的概念&#xff0c;它允許開發者為開發、測試和生產環境設置不同的配置參數。本文將詳細探討Symfony的環境配置…

7-491 3名同學5門課程成績,輸出最好成績及所在的行和列(二維數組作為函數的參數)

編程:數組存儲3名同學5門課程成績 輸出最好成績及所在的行和列 要求&#xff1a;將輸入、查找和打印的功能編寫成函數 并將二維數組通過指針參數傳遞的方式由主函數傳遞到子函數中 輸入格式: 每行輸入一個同學的5門課的成績&#xff0c;每個成績之間空一格&#xff0c;見輸入…

互聯網框架五層模型詳解

注&#xff1a;機翻&#xff0c;未校對。 What is the Five Layers Model? The Framework of the Internet Explained 五層模型互聯網框架解釋 Computer Networks are a beautiful, amazing topic. Networks involve so much knowledge from different fields, from physics…

Elasticsearch架構基本原理

Elasticsearch的架構原理可以詳細分為以下幾個方面進行介紹&#xff1a; 一、Elasticsearch基本概念 Elasticsearch&#xff08;簡稱ES&#xff09;是一個基于Lucene構建的開源、分布式、RESTful搜索和分析引擎。它支持全文搜索、結構化搜索、半結構化搜索、數據分析、地理位…