单链表的排序(一)
来源:互联网 发布: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;}
- 单链表的排序(一)
- 排序算法的数组实现 -- 插入排序(一)
- 神的规范:排序算法(一):简单插入排序
- 常见的排序算法(一) 插入排序
- 排序(一)——排序的分类及比较
- 归并排序和快速排序的衍生问题(一)
- 一摞烙饼的排序(0621)
- 常用的排序方法(一)
- 稳定的排序算法(一)
- 不稳定的排序算法(一)
- 排序方法的分类(一)
- 有意思的算法(一)----冒泡排序
- Shannoncoding (一)信源符号的排序
- 常用的排序算法(一)
- 关于排序算法的理解(一)
- 简单的排序算法整理(一)
- 快速排序的多种实现(一)
- 排序算法的总结(一)
- 转:linux目录结构及主要内容
- linux 内核调试--KDB 入门指南
- android window相关属性(二)
- 小孩睡觉模拟(Observer设计模式)
- cmd scheme 启动application
- 单链表的排序(一)
- 无限级分类原理
- php截取固定大小图片
- 纪念过去的一年 之 VII
- 对于“深入tomcat”系列的说明
- ExtJS 动态改变 Ext.data.store 的url 地址
- Unix/Linux C静态库的使用
- FSSC 22000 食品安全管理系统
- Oracle创建用户