社区
C语言
帖子详情
百分求链表的排序算法,要求速度最快!谢谢大侠
Caps77
2005-04-27 03:19:50
百分求链表的排序算法,要求速度最快!谢谢大侠
...全文
391
15
打赏
收藏
百分求链表的排序算法,要求速度最快!谢谢大侠
百分求链表的排序算法,要求速度最快!谢谢大侠
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
homeforrose
2005-04-29
打赏
举报
回复
记得去年我有一个朋友去华为面试,考官就让他用快速排序对链表进行排序.结果没有入用!
pcboyxhy
2005-04-29
打赏
举报
回复
链表转化为数组 O(n)
然后快速排序
或者堆排序
O(n*logn)
然后再转化为链表 O(n)
时间复杂度为O(n*logn)
darkstar21cn
2005-04-29
打赏
举报
回复
不能随机存取,只有用冒泡排序了。
MagicCarmack
2005-04-29
打赏
举报
回复
用stl
WingForce
2005-04-28
打赏
举报
回复
要是我来做就用stl
不去伤脑筋了
TemplatesGuy
2005-04-28
打赏
举报
回复
MK
fire314159
2005-04-28
打赏
举报
回复
快速排序。如果是链表的话,用堆排序效果很好,时间复杂度为nlogn
improgrammer
2005-04-28
打赏
举报
回复
要是我来做,要么把链表换成数组,要么就用插入排序法--链表能有多长啊?不去伤脑筋。
QuickKeyBoard
2005-04-28
打赏
举报
回复
我给出一个快速排序的方案,不过这个方案要把单向链表改为双向的才可以:
代码如下:
void quick(node *s,node *e)
{
node *i,*j;
i=s;
j=e;
int t;
t=i->data;
while(i!=j)
{
while(j->data>=t && i!=j)
j=j->prev;
i->data=j->data;
while(i->data<=t && i!=j)
i=i->next;
j->data=i->data;
}
i->data=t;
if (s!=i && s->next!=i && i->prev!=NULL)
quick(s,i->prev);
if (i!=e && i->next!=e && i->next!=NULL)
quick(i->next,e);
}
hikuers
2005-04-27
打赏
举报
回复
/* 堆排序的算法源程序*/
#define MAXNUM 100
#include<stdio.h>
typedef int KeyType;
typedef int DataType;
typedef struct
{ KeyType key; /* 排序码字段 */
/*DataType info; 记录的其它字段 */
}RecordNode;
typedef struct
{ RecordNode record[MAXNUM];
int n; /* n为文件中的记录个数,n<MAXNUM */
}SortObject;
#define leftChild(i) 2*(i)+1
void sift(SortObject * pvector, int i, int n)
{int child; RecordNode temp =pvector->record[i];
child=leftChild(i); /* Rchild是R0的左子女 */
while(child<n)
{if((child<n-1)&&(pvector->record[child].key<pvector->record[child+1].key))
child++; /* child 指向Ri的左、右子女中排序码较大的结点 */
if(temp.key<pvector->record[child].key)
{ pvector->record[i]=pvector->record[child];
/* 将Rchild换到父结点位置,进入下一层继续调整*/
i=child; child=leftChild(i);
}
else break; /* 调整结束 */
}
pvector->record[i]=temp; /* 将记录Ri放入正确位置 */
}
void heapSort(SortObject * pvector) /* 对记录R0到Rn-1进行堆排序 */
{int i, n;RecordNode temp; n=pvector->n;
for(i=n/2-1; i>=0; i--)
sift(pvector,i,n); /* 建立初始堆 */
for(i=n-1; i>0; i--) /* 进行n-1趟堆排序 */
{temp=pvector->record[0]; /* 当前堆顶记录和最后一个记录互换 */
pvector->record[0]=pvector->record[i];
pvector->record[i]=temp;
sift(pvector,0,i); /* 从R0到Ri-1重建堆 */
}
}
SortObject vector={49,38,65,97,76,13,27,49};
int main(){
int i;
vector.n=8;
heapSort(&vector);
for(i=0;i<8;i++)
printf("%d ",vector.record[i]);
return 0;
}
useresu
2005-04-27
打赏
举报
回复
忘了把节点的结构写出来
#define SIZE 200
typedef struct{
ElemType elem; /*元素类型*/
int next; /*指针项*/
}NodeType; /*表结点类型*/
typedef struct{
NodeType r[SIZE]; /*静态链表*/
int length; /*表长度*/
}L_TBL; /*静态链表类型*/
useresu
2005-04-27
打赏
举报
回复
int Partition(S_TBL *tbl,int low,int high) /*一趟快排序*/
{ /*交换顺序表tbl中子表tbl->[low…high]的记录,使支点记录到位,并反回其所在位置*/
/*此时,在它之前(后)的记录均不大(小)于它*/
tbl->r[0]=tbl->r[low]; /*以子表的第一个记录作为支点记录*/
pivotkey=tbl->r[low].key; /*取支点记录关键码*/
while(low<higu) /*从表的两端交替地向中间扫描*/
{ while(low<high&&tbl->r[high].key>=pivotkey) high--;
tbl->r[low]=tbl->r[high]; /*将比支点记录小的交换到低端*/
while(low<high&&tbl-g>r[high].key<=pivotkey) low++;
tbl->r[low]=tbl->r[high]; /*将比支点记录大的交换到低端*/
}
tbl->r[low]=tbl->r[0]; /*支点记录到位*/
return low; /*反回支点记录所在位置*/
}
void QSort(S_TBL *tbl,int low,int high) /*递归形式的快排序*/
{ /*对顺序表tbl中的子序列tbl->[low…high]作快排序*/
if(low<high)
{ pivotloc=partition(tbl,low,high); /*将表一分为二*/
QSort(tbl,low,pivotloc-1); /*对低子表递归排序*/
QSort(tbl,pivotloc+1,high); /*对高子表递归排序*/
}
}
useresu
2005-04-27
打赏
举报
回复
没有最快的排序方法啊,
视具体情况而定的,
跟你原始序列的顺序,和数据量大小都有关系的.
一般情况下认为快速排序是嘴快的
但是数据量大的话,堆排序就有优势了
useresu
2005-04-27
打赏
举报
回复
啊,没有最快的排序吧,
不同的情况要选择不同的排序方法的,
快速排序在一般情况下认为是最快的,
但是数据量大的话,
堆排序就又有优势了.
hash表也是很好的排序方法.
zengwujun
2005-04-27
打赏
举报
回复
#include <malloc.h>
#include <stdio.h>
struct node
{
int data;
struct node *next;
};
//冒泡排序
void sort(node* head)
{
node *pre,*p1,*p2;
node *tail=0;
int nLen=0;//链表长度
p1=head;
while(p1)
{
nLen++;
p1=p1->next;
}
if(nLen==0 || nLen==1)return;
p1=head;p2=p1->next;
//对nLen长的链表,执行nLen-1次冒泡
for(int i=1;i<nLen;++i)
{
while(p2!=tail)
{
//交换
if(p1->data > p2->data)
{
if(p1==head){
p1->next=p2->next;
p2->next=p1;
pre=p2;
p1=pre->next;p2=p1->next;
}
else
{
pre->next=p2;
p1->next=p2->next;
p2->next=p1;
p1=pre->next;p2=p1->next;
}
}
pre=p1;p1=p1->next;p2=p2->next;
}
//一趟排序完毕,tail指向已排好序部分的第一个
tail=p1;p1=head;p2=p1->next;
}
}
void main()
{
int a[8]={2,4,7,8,6,23,80,11};
node *head=0,*p,*pre;
for(int i=0;i<8;++i)
{
p=(node*)malloc(sizeof(node));
p->data=a[i];
p->next=0;
if(head==0)
head=pre=p;
else
{
pre->next=p;
pre=p;
}
}
printf("Before sort:");
p=head;
while(p)
{
printf("%4d",p->data);
p=p->next;
}
printf("\n");
sort(head);
printf("Before sort:");
p=head;
while(p)
{
printf("%4d",p->data);
p=p->next;
}
printf("\n");
}
完整视频-coursera公开课 普林斯顿算法 ⅠⅡ部分
本资源为BT文件,下载
速度
快,如果P2P工具支持下载字幕可以进行下载 Coursera上的公开课,普林斯顿大学教授Robert Sedgewick主讲《Algorithms》算法 Java实现 课程网站http://algs4.cs.princeton.edu/home/ 视频一个两部分,算法(一)主要集中在基础的数据结构、排序、查找算法。 相关主题有:并查集算法,二分查找,栈,队列,背包,插入排序,选择排序,希尔排序,快速排序, 三切分快排,归并排序,堆排序,二分堆,二分查找树,红黑树,
链表
,线性哈希表,Graham扫描,kd树。 算法(二)主要讲解图论和字符串处理的相关算法。相关主题有:深度优先搜索,宽度优先搜索,拓扑排序,Kosaraju-Sharir算法,Kruskal算法,Prim算法,Dijkistra算法,Bellman-Ford算法, Ford-Fulkerson算法, LSD radix sort算法, MSD radix sort算法, 3-way radix 快排算法, 多路尝试法, 三元查找尝试法, Knuth-Morris-Pratt算法, Boyer-Moore算法, Rabin-Karp算法, 正则匹配, run-length编码, Huffman编码, LZW压缩, 还有Burrows-Wheeler变换。
【算法专题】
链表
排序算法
总结
链表
排序算法
总结 概述 问题描述:给定一个
链表
,请将这个
链表
升序排列。 节点定义: struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; 1
链表
插入排序 题目描述:Leetcode 0147
链表
进行插入排序 分析 因为头结点可能会改变,因此需要设置一个虚拟头结点dummy。 我们从前向后遍历整个
链表
,假设当前考察节点为p,我们需要从
万字长文,
链表
排序算法
——冒泡排序、选择排序、插入排序、归并排序、快速排序、计数排序、桶排序、基数排序精讲及python实现
在数组排序中,常见的
排序算法
有:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序等。而对于
链表
排序而言,因为
链表
不支持随机访问,访问
链表
后面的节点只能依靠next指针从头部顺序遍历,所以相对于数组排序问题来说,
链表
排序问题会更加复杂一点。下面先来总结一下适合
链表
排序与不适合
链表
排序的算法:冒泡排序选择排序插入排序归并排序快速排序计数排序桶排序基数排序。希尔排序。堆排序。希尔排序为什么不适合
链表
排序?希尔排序:希尔排序中经常涉及到对序列中第。
常用
链表
排序算法
转载自:http://blog.csdn.net/northplayboy/article/details/552388 ========================== 功能:选择排序(由小到大) 返回:指向
链表
表头的指针 ========================== */ /* 选择排序的基本思想就是反复从还未排好序的那些节点中, 选出键值(就是
链表
排序算法
排序算法
概述盗个图转自:https://www.cnblogs.com/onepixel/articles/7674659.html
排序算法
复杂度由于是
链表
排序,首先定义
链表
节点数据结构common.htypedef struct Node LNode; struct Node { int data; LNode *next; LNode *prev; };备注:以下排序...
C语言
69,373
社区成员
243,080
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章