下標處理問題

2021-08-26 06:24:07 字數 2083 閱讀 6740

下標處理問題

主要是針對於插入排序演算法寫的程式,其他情況可以借鑑這些思路。

數學上或者通常意義上,下標都是從1開始的,但是在多數程式語言裡面陣列下標都是從0開始的,這就很惱火了,簡單乙個下標處理起來卻異常麻煩!請看

例如:(1)典型的陣列下標越界問題

假設有個陣列:a[0] a[1],我們要用插入法排序,把a[1]插入到a[0]前面,插入法是這樣寫的

while( a[j]>temp) // j=0; temp=a[1];

a[j+1]=temp;

其原理是把比temp(即a[1])小的元素挨個往後移,騰出前面的乙個位置將temp插進去,但是當j=0是,如果a[0]>a[1],那麼j將減小到-1,在執行while時就會遇到a[-1]。為了解決這個問題,每次都要判斷j是否越界,即寫成

if( j != 0 )

j--;

else

break;

而且這樣寫還不行,越界問題解決了,邏輯問題上又有問題,所以說很蛋疼。通常為了避免下標越界的問題,某些人喜歡用a[0]做「哨兵」(即把上面的temp換成a[0]),這樣就迴避了越界的問題,**簡潔了許多。但是使用「哨兵」對資料結構有要求,那就是a[0]要空出來,不存資料,專門做哨兵。

(2)下標預設為1的情況

在matlab中所有下標預設是自然數(1,2,3),不允許出現0,這就惱火了,因為所有的演算法都是從0開始的,要是沒有0會出現一些邏輯問題,所以後來我只能用「p_」這種形式來表示向量的下標了,傳統的陣列根本用不上。

下標0和1矛盾的解決方案

剛才說了,一種方法就是每次都檢測是否會越界,例如下面的直接插入排序演算法:

直接插入排序(無哨兵的情況)

#include

void insertsort(int *a, int r)

;print(a,6);

insertsort(a, 5);

print(a,6);

return 0;

第二種方案,設定哨兵,但倘若資料是從0開始儲存的就不適合,所以要用另外乙個陣列去拷貝原陣列,新生成的陣列首元素不存資料。演算法如下:

直接插入排序(a[0]作哨兵)

#include

void insertsort(int *a, int r)

;int b[7], i;

for(i=0, b[0]=0; i<6; i++)

b[i+1]=a[i];

print(b,7);

insertsort(b, 6);

print(b,7);

return 0;

也可以把拷貝陣列a的操作放在插入演算法內部,這樣就可以直接傳遞一般格式的陣列。

然而,上面這種拷貝記錄,在新記錄上操作的方法要拷貝資料過來,如果不拷貝回去,那麼a陣列就相當於報廢了,倘若a陣列還有其他函式呼叫,那麼就必須拷貝回去,拷過來又拷過去,效率就稍微低了一點。

下面是我發明的頭尾哨兵法,這不僅僅是乙個演算法,而是一種通用的思路。

直接插入排序(頭尾哨兵法)

思路是這樣的:我們先把a[0]的值儲存,然後用a[0]做哨兵,最後再恢復a[0]的值並

插入到合適的位置,這就相當於我們先對a[1]到a[r]進行排序,然後再插入a[0],插入

的時候又有可能插入到最末尾的情況,這是又會造成越界,所以還必須用最末尾的元素

a[r]做哨兵,這就是為什麼我取名為「頭尾哨兵法」的原因。

#include

void insertsort(int *a, int r)

;print(a,6);

insertsort(a, 5);

print(a,6);

return 0;

最後,再來回顧一下解決下標的方法:

1. 最直接的方法就是每次檢查是否越界,但是要執行多次類屬於if(j!=0)的判斷;

2. **量最簡單的方法就是把a[0]當做哨兵用,排序的時候只對a[1]到a[r]排序;

3. 最高效但是思路稍微複雜一點的方法是我自創的「首尾哨兵法」,對a[1]到a[r]排序,然後插入a[0],同對a[0]到a[r]排序而言效率稍好,但最主要的是它解決了普通哨兵法要求首元素儲存為哨兵的要求。

ORACLE 異常處理問題處理

create or replace procedure pro people as begin select per id into v per id from people where id i id exception when no data found then v per id 1 whe...

請求處理問題 收藏

問題描述 說有一台機器,上面有m個儲存空間。然後有n個請求,第i個請求計算時需要佔r i 個空間,儲存計算結果則需要佔據o i 個空間 其中 o i 題解 假設可以滿足所有請求,並且處理請求的順序是 r1,r2,r n 1 r n 那麼儲存完所有的請求結果後,剩餘的儲存空間為l m o i 如果假設...

應急處理問題思路

做資料庫時間長了,可能會經常去客戶那裡進行應急處理問題,特別是客戶急急忙忙的給你打 說資料庫執行很慢,甚至說資料庫無法使用了,讓你到客戶現場去解決問題,這個可能是大家最不想出現的,因為這個很急,到客戶現場需要趕緊解決問題,那麼如果你遇到了這個問題,也不要慌,還是按照自己的思路去解決,只不過要思路敏捷...