插入排序之表插入排序
1.表插入排序只是求得一個有序的連結串列,它是修改指標的值來代替移動記錄,操作過程如下
2.但是這樣只能進行順序查詢,不能進行隨機查詢,為了能實現有序表的折半查詢,需要對記錄進行重新排列。操作過程如下:
3.測試程式如下:
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> using namespace std; typedef struct xxx{ int head;//頭結點 int a[100];int next[100];//記錄下一個元素的位置 int len; xxx(){ head = 1; memset(next, 0, sizeof(next)); } void outList(){ for(int i=1; i<=len; ++i){ cout<<a[i]<<" "; } cout<<endl; } }Listx; Listx Lx; void table_insertion_sort(){//表插入排序,相當於靜態連結串列 for(int i=2; i<=Lx.len; ++i){ int pre, p; for(p=Lx.head; p && Lx.a[p]<Lx.a[i]; pre=p, p=Lx.next[p]); if(p==0){ Lx.next[pre] = i; } else if(p==Lx.head){ Lx.next[i] = Lx.head; Lx.head = i; }else { Lx.next[pre] = i; Lx.next[i] = p; } } //輸出 for(int i=Lx.head; i; i = Lx.next[i]) cout<<Lx.a[i]<<" "; cout<<endl; } void arrang_table() { int p = Lx.head, q; for(int i=1; i<Lx.len; ++i){ while(p < i) p = Lx.next[p];//第i個記錄在表中的位置不應該小於 i,如果小於i,說明該元素已經被交換位置了,可以通過next繼續尋找 q = Lx.next[p];//指向下一個節點 if(p!=i){//第p個元素應該在第i個位置 swap(Lx.a[i], Lx.a[p]); swap(Lx.next[i], Lx.next[p]); Lx.next[i] = p;//該元素之前的位置 p,指向被移走的記錄,使得以後可由while迴圈找回 } p = q; } for(int i=1; i<=Lx.len; ++i) cout<<Lx.a[i]<<" "; cout<<endl; } int main() { int i; scanf("%d", &Lx.len); for(i=1; i<=Lx.len; i++) scanf("%d", &Lx.a[i]); table_insertion_sort(); arrang_table(); return 0; }
相關推薦
插入排序之表插入排序
1.表插入排序只是求得一個有序的連結串列,它是修改指標的值來代替移動記錄,操作過程如下 2.但是這樣只能進行順序查詢,不能進行隨機查詢,為了能實現有序表的折半查詢,需要對記錄進行重新排列。操作過程如下: 3.測試程式如下: #include<iostream> #include
內部排序(3)——插入排序之折半插入排序
復雜 span oid pre 時間 查找 insert -1 順序 因為插入排序的基本思想是在一個有序序列中插入一個新的記錄,則能夠利用"折半查找"查詢插入位置,由此得到的插入排序算法為"折半插入排序"。算法例如以下: void BInsertSort () {
內部排序->插入排序->其它插入排序->表插入排序
com 算法 其他 inf gif 時間 pla 長度 直接插入排序 文字描述 和之前的插入排序比,表插入排序可以保證排序過程中不移動記錄;因此表插入排序所用的存儲結構和之前的順序存儲不同,表插入排序采用靜態鏈表類型作為待排記錄序列的存儲結構,設數組中下標0的分量為表頭
排序演算法--插入排序之希爾排序
希爾排序是對直接插入排序演算法的改進,把整個序列分割為若干子序列,對每個子序列進行直接插入排序,最後對整個序列進行直接插入排序(因為經過前面的子序列排序,整個序列基本有序,最後進行一次直接插入排序效率會比一開始就做排序高)。 如果掌握了直接插入排序,那麼希爾排序也比較容易理解了
排序演算法--插入排序之直接插入排序
直接插入排序的核心思想是把一個記錄插入一個有序序列中,每插入一個記錄就得到一個新的有序序列,直到所有記錄都插入成功,得到有序序列。 每次插入記錄時的有序序列如何得到,關鍵在第一次,第一次要插入的記錄時序列的第二個值,有序序列只有一個值,就是第一個記錄。 程式碼: #in
常見排序之直接插入排序
#include <stdio.h> void Direct_Insert_Sort(int *Array) { int i,j,temp; for(i = 1; i
插入排序之直接插入排序
插入排序分為兩種:直接插入排序、希爾排序 一、直接插入排序 插入排序(英語:Insertion Sort)是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃描,找到相應位置並插入。插入排序在實現上,通常採用in-place
8大排序之-----(一)插入排序與時間複雜度
(一)什麼是插入排序呢? 插入排序就是每次把待排序的資料一個數據插入到已經排好序的正確位置。就好比,你左手拿著撲克牌,用右手去取牌的時候,把取到的牌放到左手正確的位置。 比如我們要排序4,3,5,7,6,2,1,9,88,0。 (1)我們先假設下
排序之直接插入排序
amp 直接 新元素 style 排序 public 掃描 步驟 png 排序思想 1.從第一個元素開始,我們認為第一個元素已經被排序 2.取出下一個元素,在已經排序的元素序列中從後向前掃描 3.如果該元素(已排序)大於新元素,將該元素移到下一位置 4.重復步驟3,
第七章快速排序之“快速插入排序”(練習7.4-5)
O(∩_∩)O~,這個名字乍聽起來比較黃。其實就是先快速排序進行劃分,等劃分小到一定規模比如k時,進行插入排序,因為規模小到一定程度,插入排序的效率更高。我在前面還寫過一個合併插入排序的演算法,思想跟這個相似。 總的時間複雜度為O(nk+nlg(n/k)),這個很好證明:
演算法-插入排序之直接插入排序
插入排序的基本思想: 每次將要排序的關鍵字按照其大小插入已排序的子表合適的位置,直到全部元素插入完成。 直接插入排序:所有資料被存放在R[0,n-1]中,在進行排序的過程中將R劃分為有序區和無序區兩部分,每次從無序區取出一關鍵字放在有序區合適的位置,有序區的數字排列一直是
排序之歸並排序
處理 cor delet 數據 sort img str 內存 amp 歸並排序在外排序和內排序的作用都是非常大的,本人覺得要是要用戶外排。在處理大數據排序,當內存大小不足以把所有數據一次載入時,這時就需要歸並排序。以下進行的是2路歸並排序為主。 數組遞歸歸並 1 v
基數排序之多keyword排序運用隊列
printf mod n) key sort article name str oid 源碼例如以下: #include <stdlib.h> #include <stdio.h> typedef struct QUEUEnode* li
Java排序之直接選擇排序
循環 oid 之間 min static cts ava void ont public class SelectSort { public static void selectSort(int [] a){ int min; int te
(4)排序之希爾排序
減少 http 復雜度 需要 ... clas center 記錄 str 轉載:http://www.cnblogs.com/jingmoxukong/p/4303279.html 要點 希爾(Shell)排序又稱為縮小增量排序,它是一種插入排序。它是直接插入排序算法的一
經典排序之歸並排序
col 元素 -i family font 穩定排序 ack body 等於 歸並排序(Merge Sort)是建立在歸並操作上的一種有效的排序算法,它將已有序的子序列合並,得到完全有序的序列。 歸並排序的速度僅次於快速排序,時間復雜度為O(nlogn),為穩定排序算法,
Java排序之歸並排序
urn source tail 簡介 i++ 得到 長度 gear public Java排序之歸並排序 1. 簡介 歸並排序的算法是將多個有序數據表合並成一個有序數據表。如果參與合並的只有兩個有序表,則成為二路合並。對於一個原始的待排序數列,往往可以通過分割的方法來歸結為
排序之希爾排序(JS)
tps 次數 shellSort 轉載 提升 時間復雜度 tar 高效 長大 希爾排序(Shell‘s Sort)是插入排序的一種又稱“縮小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一種更高效的改進版
排序演算法--選擇排序之簡單選擇排序
在待排序記錄中,選擇一個最小的數,和第一個記錄交換位置,在剩下n-1個的記錄中選擇最小的和第二個記錄交換,依次類推,最終可以得到一個有序的序列。 程式碼: #include <string.h> #include <malloc.h> #includ
常見排序之希爾排序
#include <stdio.h> #include <stdlib.h> void ShellSort(int a[], int length) { int increment;