12 單鏈表排序

2021-06-16 08:59:56 字數 2810 閱讀 5873

思路1:

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

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

思路2:

排序演算法有

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

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

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

4,       歸併排序

5,       基數排序

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

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

複雜的有堆排序。

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

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

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

// 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, int index )

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()

{ string str;

cout << "input the link table :"<> str;

struct node *phead = create( str );

//insert_sort( phead ); //選中即為插入排序

//merge_sort( phead->next ); //選中即為歸併排序

phead->next = quicksort( phead->next); //選中即為快速排序

cout<< "the result of sort is:" <

單鏈表之排序單鏈表

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

單鏈表排序

思路1 將鍊錶中的資料存入陣列中,使用陣列進行排序,排好後再存入鍊錶中。當然這並不是這題所要考察的。但是在實際應用中卻相當有價值。因為鍊錶中的排序演算法都比較慢,進行轉存再排序也是一種很好的方法。思路2 排序演算法有 1,插入排序 簡單插入排序,希爾排序 2,交換排序 氣泡排序,快速排序 3,選擇排...

單鏈表排序

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