之前也花了一點時間去學習數據結構和算法,但沒有沉下心去學 . . .
從現在開始,我會更新一些好玩的算法,大家多多支持,雖然也沒多少人看 . . .
數組模擬鏈表
鏈表的優點就是對數據的增加與刪除比較方便,而數組的優點就是對數據的查找與修改 . . .
那我們可不可以想到一個方法,讓數組能夠幹鏈表的事呢 ?
接下來就讓我們來體驗一下這思想上愉悅的感覺吧 ^ _ ^
我們都知道鏈表的結點之間都是通過一個指針有相連的,數組的索引方式是通過下標的進行的,所以我們就 用數組的下標來完成鏈表的結點相連操作
. . .
模擬鏈表的大概樣子如下圖所示:
第一個數組是用來存放數據的,它最後多出的一個空間是用來存儲插入的數據
第二個數組是第一個數據數組索引的下一個索引,比如數據1,它的索引是1,所以它的下一個索引是 2,大體思路就是通過這下一個索引來訪問數據 . . .
.
我們要完成的是插入一個數據,最後通過這個類似鏈表指針的數組來完成簡單訪問排序
的例子 . . .
.
大體的思路如下:
- 將插入的數據放在最後一個元素中
- 插入的數據與前面的數據逐個比較,找到合適的位置
- 找到合適位置之後,將他們的數據索引的下一個索引交換位置
思路圖如下:
- 插入數據
- 逐個比較,找到合適位置
- 數據索引的下一個索引交換位置
最後我們通過這個 right數組來訪問 arr中的元素,這樣我們訪問到的元素就是排序好的數據了. . .
.
下面我們來用代碼來測試一下吧
#include <stdio.h>
int main()
{
int arr[11] = {0, 1, 2, 3, 5, 6, 7, 8, 9, 10}; // 存儲的數據
int right[11] = {0, 2, 3, 4, 5, 6, 7, 8, 9, 0}; // 與arr對應的數據索引的下一個索引
arr[10] = 4; // 插入的數據
int i = 9; // 與之比較的第一個索引下標
while(i >= 0) // 開始尋找合適的位置
{
if(arr[10] > arr[i])
{
right[10] = right[i]; // 開始交換 right中的下標索引
right[i] = 10;
break;
}
i--;
}
i = 1;
while(i != 0)
{
printf("%d ", arr[i]);
i = right[i]; // 利用 right中的數據來輸入arr的數據
}
return 0;
}
程序的結果如下圖所示:
.