没法了,大家救命啊!!(114分奉上)

fanz2000 2001-12-22 03:14:23
快到交课程设计的时候了
怎么用c语言对一个单链表的关键字排序啊,
最好再另辟一个空间
有谁写过啊,
麻烦哪位给我一个自己写过的这种功能的函数或程序啊
114分奉上
...全文
53 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
z_yheart 2001-12-22
  • 打赏
  • 举报
回复
快速排序实现
作者:ilovec 2001.10.6

#include <stdio.h>
#include <math.h>
#include <process.h>
#include <stdlib.h>
#include <conio.h>
#include <bios.h>

#define TRUE 1
#define FALSE 0
#define OK 2
#define ERROR -1
#define INFEASIBLE -2
#define OVERFLOW -3
#define MAXSIZE 20

typedef int status;
typedef int keytype;
typedef struct {
keytype key;
}elemtype;

#define EQ(a,b) ((a)==(b))
#define LT(a,b) ((a)< (b))
#define LQ(a,b) ((a)<=(b))

typedef struct {
elemtype *elem;
int length;
}table;

void bufclr(void);
status createtable1(table *);
void printtable(table);
void quicksort(table);
void Qsort(table,int,int);
int partition(table,int,int);

void main()
{
table t;
int i;
keytype key;
clrscr();
if(createtable1(&t)!=2)
exit(ERROR);
printtable(t);
quicksort(t);
printtable(t);
getch();
}

status createtable1(table *pt)
{
int i;
pt->elem=(elemtype *)malloc(sizeof(elemtype)*(MAXSIZE+1));
if(!pt->elem)
return OVERFLOW;
for(i=1;i<=1000;i++){
pt->elem[i].key=random(1000);
}
pt->length=MAXSIZE;
return OK;
}

void bufclr()
{
if(fflush(stdin))
exit(ERROR);
}

void printtable(table t)
{
int i;
printf("The current table is:\n");
for(i=1;i<t.length+1;i++){
printf("%-6d",t.elem[i].key);
if(i%10==0)
putchar('\n');
}
}

int partition(table t,int low,int high)
{
keytype pivotkey;
t.elem[0].key=t.elem[low].key;
pivotkey=t.elem[low].key;
while(low<high){
while(low<high&&t.elem[high].key>=pivotkey)
--high;
t.elem[low].key=t.elem[high].key;
while(low<high&&t.elem[low].key<=pivotkey)
++low;
t.elem[high].key=t.elem[low].key;
}
t.elem[low].key=t.elem[0].key;
return low;
}

void Qsort(table t,int low,int high)
{
int pivotloc;
if(low<high){
pivotloc=partition(t,low,high);
Qsort(t,low,pivotloc-1);
Qsort(t,pivotloc+1,high);
}
}

void quicksort(table t)
{
Qsort(t,1,t.length);
}


z_yheart 2001-12-22
  • 打赏
  • 举报
回复
思路:
设输入的序列L[p..r],确定支点元素l[p]和l[r],并使l[p].key<=l[r].key
分解(Divide):将序列L[p..r]划分成三个子序列L[p..k-1]、L[k+1..m-1]和L[m+1..r],使L[p..q]中关系为L[p..k-1]、l[k]、L[k+1..m-1]、l[m]、L[m+1..r]任一区间元素的值不大于其后区间元素的值。
递归求解(Conquer):通过递归调用快速排序算法分别对L[p..k-1]、L[k+1..m-1]和L[m+1..r]进行排序。
算法的实现(用C语言实现)
QSort(Sqlist &L,int low,int high){
c=high-low; /*循环次数*/
if(c<10)直接调用插入排序法; /*小数时直接调用插入排序法*/
if(L.r[low].key>L.r[high].key)L.r[low]<->L.r[high]; /*确保区间内第一个元素的值不大于区间内最后一个元素的值*/
ilow=low; /*小于区间内第一个元素的值数组边界下标*/
ihigh=high; /*大于区间内最后一个元素的值数组边界下标*/
for(i=low+1;i<c;i++){
if(L.r[i].key<L.r[low].key)L.r[i]<->L.r[++ilow]; /*小于区间内第一个元素的值放置ilow区间内*/
else
if(L.r[i].key>L.r[high].key){
L.r[i]<->L.r[--ihigh]; /*大于区间内最后一个元素的值放置ihigh区间内*/
i--; /*下一个比较位置不变*/
c--; /*循环次数减一*/
}
}
L.r[ilow]<->L.r[low]; /*将小于区间内第一个元素的边界下标元素与第一个元素互换*/
L.r[ihigh]<->L.r[high]; /*将大于区间内最后一个元素的边界下标元素与最后一个元素互换*/
QSort(L,low,ilow-1);
QSort(L,ilow+1,ihigh-1);
QSort(L,ihigh+1,high);
}
void QuickSort(Sqlist &L)
{
QSort(L,1,L.length);
}

优点:
1、每次快速排序将确定二个元素位置
2、每次快速排序将划分三个区间,优化后续平均时间和空间复杂度

缺点:
1、存在较多的元素交换(每次需要三步),不及改进快速排序法利用空穴赋值方便
liuto 2001-12-22
  • 打赏
  • 举报
回复
唉!...
是不是象俺一样经常逃课呀。

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧