單鏈表排序

2021-06-26 02:47:01 字數 3148 閱讀 3668

**

思路1:

將鍊錶中的資料存入陣列中,使用陣列進行排序,排好後再存入鍊錶中。

當然這並不是這題所要考察的。但是在實際應用中卻相當有價值。因為鍊錶中的排序演算法都比較慢,進行轉存再排序也是一種很好的方法。

思路2:

排序演算法有

1,       插入排序:簡單插入排序,希爾排序

2,       交換排序:氣泡排序, 快速排序

3,       選擇排序:簡單選擇排序,堆排序

4,       歸併排序

5,       基數排序

簡單的排序演算法有插入,冒泡,選擇;

中等的有合併排序,快速排序;

複雜的有堆排序。

我實現了紅色的三種排序方法。

使用鍊錶進行排序比較繁瑣,尤其是快排,需要拆分,

當然也可以多加乙個指標指向要排序的隊尾,這樣就不用拆了。

[cpp]view plain

copy

print?

// linktable.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include 

#include 

using

namespace

std;  

//鍊錶的結構體

struct

node  

;  //建立鍊錶

struct

node * create( string & str_link )  

return

phead;  

}  //輸出鍊錶

void

out_link( 

struct

node * phead )  

cout << endl;  

}  //找到第index個元素

struct

node * find_node(

struct

node* phead, 

intindex )  

return

pnode;  

}  //檢查鍊錶有無環

//有,則返回快慢指標共同指向的點

//無,則返回空指標

struct

node * check_loop( 

struct

node * phead )  

}  return

null;  

}  //去掉重複元素

void

delete_repeat_element( 

struct

node * phead )  

else

//沒有出現過,則置出現標記

}  delete

hashtable;                 

//釋放資源

}  //插入排序

void

insert_sort( 

struct

node* phead)  

if( pnode == pcur )         

//說明已排好序佇列中沒有比當前元素大的元素

else

//將pcur結點插入到pnode之前,即ppre之後

}  }  //歸併排序

//pnode 為待排序鍊錶的第乙個元素

//找中間結點

struct

node * find_mid_node( 

struct

node * pnode )  

return

pslow;  

}  //合併之後,pnode1為表頭

void

merge(

struct

node* &pnode1, 

struct

node* pnode2)  

if( !pnode2 ) 

return

;  struct

node *pnode = null;  

struct

node *phead = null;  

if( pnode1->val < pnode2->val )        

//找到表頭

else

pnode = phead;  

while

( pnode1 && pnode2 )  

else

pnode = pnode->next;  

}  if

( !pnode1 )  

pnode->next = pnode2;  

else

pnode->next = pnode1;  

pnode1 = phead;  

}  //注意,這裡的pnode是需要變的,所以用了引用,可能不太好理解

//如果讓返回值指向排行序的表頭可能會好一些

void

merge_sort( 

struct

node * &pnode )  

//快速排序

//劃分函式

//輸入:煉表頭, 輸出:新的煉表頭,選中的結點

struct

node * patition( 

struct

node * pnode, 

struct

node * &pselect )  

else

//如果不是第乙個

}  else

ppre = pscan;  

pscan = pscan->next;  

}  }  

if( flag == 0 ) 

// 所有元素都比選中的大,即選中的為表頭

return

pselect;  

else

return

phead;  

}  struct

node * quicksort( 

struct

node * pnode )  

else

//分兩個部分,pselect前面的和後面的

}  void

test()  

int_tmain(

intargc, _tchar* argv)    

單鏈表之排序單鏈表

package list public class sortedsinglylist extends singlylist 將values陣列中的所有物件按值大小插入 public sortedsinglylist t values 過載深拷貝,由單鏈表構建排序單鏈表 public sortedsi...

單鏈表排序

1 歸併排序 將鍊錶拆分成兩個鍊錶,遞迴,歸併,將兩個已排序鍊錶合併 public listnode sortlist listnode head pre.next null return merge sortlist head sortlist slow public listnode merge...

單鏈表排序

思路 sort排序函式執行一次,將鍊錶倆倆之間比較大小,比較之後,大的在後,小的在前 鍊錶節點之間只交換內容,節點不動 只有鍊錶的所有倆倆相鄰之間都是小的在前,大的在後,才返回true,否則返回false。while sort head include include include include...