鍊錶排序 直接插入排序

2021-06-19 07:41:14 字數 1920 閱讀 8398

排序函式如下:

typedef struct node

list;

node::node(int a)

void sortlist(list *&l)

//如 1 2 3 6 | 4 2 6 7

// pl 有序區 pr 無序區

node *pl = null; //有序區最左邊結點

node *pr = null; //有序區最右邊結點

node *cur = null; //while迴圈當前結點

node *cur2 = null; //for迴圈當前結點

node *pre2 = null; //for迴圈上乙個結點

node *tmp; //輔助結點,儲存被取出的結點

cur = l->next; //從鍊錶第二個結點開始

pl =pr = l; //開始時,有序區為左右邊界都為第乙個結點

while(cur!= null) //如果只有乙個結點

else //第二種情況 當前結點小於 除了第一的結點外的其他結點}}

} //第三種情況,當前結點大於有序區所有結點

else

cur = pr->next; //當前結點 指向 有序區右邊界的下乙個結點

} l = pl; //返回排序好的煉表頭結點

}

測試程式:

#include using namespace std;

typedef struct node

list;

node::node(int a)

void createlist(list *&l)

else

}pre->next = null;

}void displaylist(list *l)

}void sortlist(list *&l)

//如 1 2 3 6 | 4 2 6 7

// pl 有序區 pr 無序區

node *pl = null; //有序區最左邊結點

node *pr = null; //有序區最右邊結點

node *cur = null; //while迴圈當前結點

node *cur2 = null; //for迴圈當前結點

node *pre2 = null; //for迴圈上乙個結點

node *tmp; //輔助結點,儲存被取出的結點

cur = l->next; //從鍊錶第二個結點開始

pl =pr = l; //開始時,有序區為左右邊界都為第乙個結點

while(cur!= null) //如果只有乙個結點

else //第二種情況 當前結點小於 除了第一的結點外的其他結點}}

} //第三種情況,當前結點大於有序區所有結點

else

cur = pr->next; //當前結點 指向 有序區右邊界的下乙個結點

} l = pl; //返回排序好的煉表頭結點

}void clearlist(list *&l)

}int _tmain(int argc, _tchar* argv)

插入排序 直接插入排序

直接插入排序演算法思想 將整個資料表分成左右兩個子表,其中左子表為有序表,右子表為無序表 整個排序過程就是將右子表中的元素逐個插入到左子表中,直到右子表為空,而左子表成為新的有序表。演算法過程分析 將待排序的元素存放在陣列r n 1 中,在初始狀態下,r 0 為監視哨,r 1 為有序區,r 2 r ...

插入排序 直接插入排序

一.插入排序的基本思想 將乙個記錄插入已排序好的有序表中,從而得到乙個新的記錄數加1的有序表。要點 設立哨兵,作為臨時儲存和判斷陣列邊界之用。所謂的哨兵,就是即將插入的記錄。二.示例 如果碰見相等的元素,會被插到後面,所以,相等元素的前後順序沒有改變,插入排序是穩定的。三.演算法實現 public ...

插入排序 直接插入排序

直接插入排序的基本思想 將乙個記錄插入到已排序好的有序表中,然後得到乙個新記錄數增1的有序表。也就是 先將序列的第1個記錄看成是乙個有序的子串行,然後從第2個記錄逐個進行插入,直至整個序列有序為止。如果碰見乙個和插入元素相等的,那麼插入元素把想插入的元素放在相等元素的後面。所以,相等元素的前後順序沒...