单链表的排序(一)

来源:互联网 发布:mac os rm rf 恢复 编辑:程序博客网 时间:2024/06/13 08:31

最近准备整理一些数据结构与算法的一些东西,由于时间有限,直接上算法的代码,希望多某些朋友有些帮助:

代码已经过大概的测试,写的不好,欢迎大家发言讨论

先是插入排序,选择排序,冒牌排序算法

// Link_Node_Operate.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#include <assert.h>using namespace std;typedef struct t_Link_Node{int value;struct t_Link_Node *p_Next;}Link_Node;class Link_Node_Op{private:Link_Node *p_Node;private:void Insert_sort_Swap_Node(Link_Node *old_froMax_Node, Link_Node *old_Max_Node,Link_Node *froMax_Node, Link_Node *Max_Node){Link_Node *tmp = Max_Node->p_Next;if(old_Max_Node->p_Next == Max_Node){old_froMax_Node->p_Next = Max_Node;Max_Node->p_Next = old_Max_Node;old_Max_Node->p_Next = tmp;}else{old_froMax_Node->p_Next = Max_Node;Max_Node->p_Next = old_Max_Node->p_Next;froMax_Node->p_Next = old_Max_Node;old_Max_Node->p_Next = tmp;}}public:Link_Node_Op():p_Node(NULL){}~Link_Node_Op(){while (p_Node){Link_Node *tmp_node = p_Node;p_Node = p_Node->p_Next;delete tmp_node;}}void List_Print(){if(!p_Node){cout<< "list head is null!" <<endl;return;}else if(!p_Node->p_Next){cout<< "list has no elements!"<<endl;return;}Link_Node *p = p_Node->p_Next;while(p){cout << p->value << " ";p = p->p_Next;}cout << endl;}void Create_Link_List(int nsize) {assert(p_Node == NULL);p_Node = new Link_Node;// node headp_Node->value = 0;p_Node->p_Next = NULL;for (int i = 0; i < nsize; i++){Link_Node *new_node = new Link_Node;cin >> new_node->value;if(new_node->value == 0){printf("value equals 0 means head, invalid input, try again!");delete new_node;i--;}new_node->p_Next = p_Node->p_Next;p_Node->p_Next = new_node;}}void Insert_sort(){if(!p_Node || !p_Node->p_Next)return;Link_Node *p = p_Node->p_Next;int ncount = 0;while (p){ncount++;p = p->p_Next;}p = p_Node;Link_Node *fro_Node, *froMax_Node;Link_Node *cur_Node, *Max_Node;for (int i = 0; i < ncount - 1; i++){froMax_Node = p;Max_Node = p->p_Next;fro_Node = p->p_Next;cur_Node = fro_Node->p_Next;while(cur_Node){if(Max_Node->value < cur_Node->value){froMax_Node = fro_Node;Max_Node = cur_Node;}fro_Node = cur_Node;cur_Node = cur_Node->p_Next;}if(Max_Node != p->p_Next)Insert_sort_Swap_Node(p, p->p_Next,froMax_Node, Max_Node);p = p->p_Next;}}void bubble_sort2() //交换节点{if(!p_Node || !p_Node->p_Next)//头结点为NULL,或者没有Nodereturn;Link_Node *p = p_Node->p_Next;int ncount = 0;while (p){ncount++;p = p->p_Next;}Link_Node *fro_Node ;Link_Node *cur_Node ;for (int i = ncount - 1; i > 0; i--){int j = i;fro_Node = p_Node;cur_Node = p_Node->p_Next;while (j > 0){if (cur_Node->value > cur_Node->p_Next->value){p = cur_Node->p_Next;fro_Node->p_Next = p;cur_Node->p_Next = p->p_Next;p->p_Next = cur_Node;}cur_Node = fro_Node->p_Next->p_Next;fro_Node = fro_Node->p_Next;j--;}}}void bubble_sort()//冒泡排序,不交换节点,仅交换数值{if(!p_Node || !p_Node->p_Next)return;Link_Node *p = p_Node->p_Next;int ncount = 0;while (p){ncount++;p = p->p_Next;}p = p_Node->p_Next;for (int i = ncount - 1; i > 0; i--){int j = i;while(j > 0){if(p->value > p->p_Next->value){int tmp = p->value;p->value = p->p_Next->value;p->p_Next->value = tmp;}p = p->p_Next;j--;}p = p_Node->p_Next;}}void select_sort(){if(!p_Node || !p_Node->p_Next)return;Link_Node *p_order_link = NULL;Link_Node *p_Cur_Node = p_Node->p_Next;Link_Node *p_fro_Cur_Node = p_Node;Link_Node *p_fro_Max_Node = NULL, *p_Max_Node = NULL;while(p_Cur_Node){p_fro_Max_Node = p_fro_Cur_Node;p_Max_Node = p_Cur_Node;for(p_Cur_Node; p_Cur_Node != NULL;p_fro_Cur_Node = p_Cur_Node, p_Cur_Node = p_Cur_Node->p_Next){if(p_Max_Node->value < p_Cur_Node->value){p_fro_Max_Node = p_fro_Cur_Node;p_Max_Node = p_Cur_Node;}}//从老的link中抽出这个最大的Node,并插入新的有序的link中p_fro_Max_Node->p_Next = p_Max_Node->p_Next;if(p_order_link == NULL){p_order_link = p_Max_Node;p_order_link->p_Next = NULL;}else{p_Max_Node->p_Next = p_order_link;p_order_link = p_Max_Node;}//从头开始p_fro_Cur_Node = p_Node;p_Cur_Node = p_Node->p_Next;}p_Node->p_Next = p_order_link;}};//test caseint _tmain(int argc, _TCHAR* argv[]){Link_Node_Op Node_List;int ncount = 0;cout<< "input node count you want to create:" << endl;cin >> ncount;cout << "Node List length:" << ncount<< endl;Node_List.Create_Link_List(ncount);cout << "print nodes value:" << endl;Node_List.List_Print();cout << "do sort operation!" << endl;//Node_List.bubble_sort();//Node_List.bubble_sort2();//Node_List.Insert_sort();Node_List.select_sort();cout << "print nodes value:" << endl;Node_List.List_Print();return 0;}


原创粉丝点击