演算法基礎 使用迴圈不變式解決插入排序問題

2021-08-07 11:57:30 字數 827 閱讀 3139

思想是直接插入排序,即每次拿乙個數字向已排序好的數字中插入,採用迴圈不變式的設計思想。

迴圈不變式:一般而言,用這個式子表示希望得到的結果,如果在迴圈的每一步,這個式子都是正確的,那麼迴圈結束後,這個式子也正確,並得到了期望的結果。

如何證明迴圈的每一步式子都是正確的?

需要證明式子滿足三個性質:

初始化:迴圈的第一次迭代之前,它為真。

保持:如果迴圈的某次迭代之前它為真,那麼下次迭代仍然為真。

終止:證明迴圈終止時,是期望結果。

**:

package com.zjq.arithmetic.sort;

public class insert_sort ;

insert_sort insert_sort=new insert_sort();

eg=eg=insert_sort.insertsort(eg);

for(int m=0;m=0&&array[j]>k)

array[j+1]=k;

} return array;

}}

只要迴圈之前array[i-1](下標是原陣列的0至i-1)是排序好的陣列,那麼下次迴圈得到

array[i](下標是原陣列的0至i)

仍然是排序好的陣列,並且迴圈結束時得到的是整個排序好的陣列。

此**滿足迴圈不變的三個性質。

1 初始化:迴圈下標從1開始,初始時候下標0,陣列只有乙個數array[0],當然是排序好的。

2 保持:每次迴圈是將新的數字插入到上一次排序好的陣列中,得到讓然是排序好的陣列。

3 終止;迴圈終止時候,得到的是原陣列排序好的陣列,符合期望。

排序 插入排序(迴圈不變式)

插入排序的思想是構造乙個迴圈不變式,可用撲克牌的例子來解釋,左手為已經排好序的牌,右手為未排好序的牌,分別將右手中的牌依次一張一張地插入到左手,將左手中的每一張牌依次和這張牌比較,以此來確定這張牌在左手中的正確順序,然後進行下一張牌,在這個過程中,左手中的牌始終是排好序的,即不變的,稱為迴圈不變式 ...

插入排序與迴圈不變式

首先,給出本文要使用的例子,對乙個陣列a進行公升序的插入排序 演算法的c語言描述 cpp view plain copy void insersort inta,intlength a j 1 key 迴圈不變式是用於檢驗演算法的正確性的。在演算法中,有一些特定的性質 也是我們我們實現這個演算法最關...

《演算法基礎 開啟演算法之門》一2 3 迴圈不變式

對於線性查詢的3個演算法,我們能很容易地看到每個演算法均能生成正確的結果。但是有時候生成正確的結果看起來有點難。這涉及一系列技術,在這裡不能一一講解。證明正確性的乙個常用方法是使用迴圈不變式證明 即證明迴圈的每次迭代之前迴圈不變式為真。迴圈不變式能夠幫助我們證明正確性,關於迴圈不變式,我們必須證明以...