C++单向链表 冒泡排序
structstudent{longnum;floatscore;student*next;};最好有详细讲解...
struct student
{
long num;
float score;
student *next;
};
最好有详细讲解 展开
{
long num;
float score;
student *next;
};
最好有详细讲解 展开
2013-07-04
展开全部
template<class T>
class ChainNode{
friend Chain<T>;
template <class T> friend ostream& operator<<(ostream& os, const Chain<T>& c);
private:
T data;
ChainNode<T>* link;
};
template<class T>
class Chain{
friend ChainIterator<T>;
private:
ChainNode<T>* first;
bool Bubble(ChainNode<T>* current); // 递归函数,从链表的最后一对数开始冒泡至current
pubilc:
void InsertionSort(); //插入算法对链表进行升序排序,不得创建新结点和删除老结点
void BubbleSort(); // 冒泡排序
void SelectionSort(); // 选择排序
void RankSort(); // 计数排序
};
template <class T>
void Chain<T>::InsertionSort() //插入算法对链表进行升序排序,不创建新结点和删除老结点
{
if (first)
for (ChainNode<T>* current = first; current->link;){ // current->link为当前要插入的数据
for (ChainNode<T>* p = first; p->data < current->link->data; p = p->link); // p指向表中第一个大于或等于当前要插入数据的数据
if (p == current->link){ // 表中没有比current->link大的数据
current = current->link;
continue; // 继续下一个数据插入
}
if (p!= current){ // 将要插入的数据挪到第一个比它大的数后面
ChainNode<T>* n = current->link->link;
current->link->link = p->link;
p->link = current->link;
current->link = n;
}
else
current = current->link; // 如果已经在第一个比他大的数后面了,更新current->link
T x = p->link->data; //交换要插入元素和他前面那个比它大的元素
p->link->data = p->data;
p->data = x;
}
}
// 问题1:插入排序对于已排好序的链表仍需检验n(n - 1)次,能否及时终止插入排序?
template <class T>
bool Chain<T>::Bubble(ChainNode<T>* current) // 递归函数,从链表的最后一对数开始冒泡至current
{
bool sorted = true; // 如果链表已排好序(未发生交换),返回true
if (current && current->link && current->link->link)
sorted = Bubble(current->link);
if (current->data > current->link->data){
T temp = current->data;
current->data = current->link->data;
current->link->data = temp;
sorted = false;
}
return sorted;
}
template <class T>
void Chain<T>::BubbleSort() // 冒泡排序
{
bool sorted = false;
for (ChainNode<T>* start = first; start && start->link && !sorted; start = start->link)
sorted = Bubble(start);
}
问题2:不使用递归函数能否以同样的检索次数排序?
template <class T>
void Chain<T>::SelectionSort() // 选择排序
{
bool sorted = false;
for (ChainNode<T>* start = first; start && start->link && !sorted; start = start->link){
sorted = true;
for (ChainNode<T>* current = start->link; current; current = current->link){
if (current->data < start->data){ // 交换
T temp = current->data;
current->data = start->data;
start->data = temp;
}
if (sorted && current->link &¤t->data > current->link->data) // 如果在链表中存在比后一项大的项,则表示未排序
sorted = false;
}
}
}
class ChainNode{
friend Chain<T>;
template <class T> friend ostream& operator<<(ostream& os, const Chain<T>& c);
private:
T data;
ChainNode<T>* link;
};
template<class T>
class Chain{
friend ChainIterator<T>;
private:
ChainNode<T>* first;
bool Bubble(ChainNode<T>* current); // 递归函数,从链表的最后一对数开始冒泡至current
pubilc:
void InsertionSort(); //插入算法对链表进行升序排序,不得创建新结点和删除老结点
void BubbleSort(); // 冒泡排序
void SelectionSort(); // 选择排序
void RankSort(); // 计数排序
};
template <class T>
void Chain<T>::InsertionSort() //插入算法对链表进行升序排序,不创建新结点和删除老结点
{
if (first)
for (ChainNode<T>* current = first; current->link;){ // current->link为当前要插入的数据
for (ChainNode<T>* p = first; p->data < current->link->data; p = p->link); // p指向表中第一个大于或等于当前要插入数据的数据
if (p == current->link){ // 表中没有比current->link大的数据
current = current->link;
continue; // 继续下一个数据插入
}
if (p!= current){ // 将要插入的数据挪到第一个比它大的数后面
ChainNode<T>* n = current->link->link;
current->link->link = p->link;
p->link = current->link;
current->link = n;
}
else
current = current->link; // 如果已经在第一个比他大的数后面了,更新current->link
T x = p->link->data; //交换要插入元素和他前面那个比它大的元素
p->link->data = p->data;
p->data = x;
}
}
// 问题1:插入排序对于已排好序的链表仍需检验n(n - 1)次,能否及时终止插入排序?
template <class T>
bool Chain<T>::Bubble(ChainNode<T>* current) // 递归函数,从链表的最后一对数开始冒泡至current
{
bool sorted = true; // 如果链表已排好序(未发生交换),返回true
if (current && current->link && current->link->link)
sorted = Bubble(current->link);
if (current->data > current->link->data){
T temp = current->data;
current->data = current->link->data;
current->link->data = temp;
sorted = false;
}
return sorted;
}
template <class T>
void Chain<T>::BubbleSort() // 冒泡排序
{
bool sorted = false;
for (ChainNode<T>* start = first; start && start->link && !sorted; start = start->link)
sorted = Bubble(start);
}
问题2:不使用递归函数能否以同样的检索次数排序?
template <class T>
void Chain<T>::SelectionSort() // 选择排序
{
bool sorted = false;
for (ChainNode<T>* start = first; start && start->link && !sorted; start = start->link){
sorted = true;
for (ChainNode<T>* current = start->link; current; current = current->link){
if (current->data < start->data){ // 交换
T temp = current->data;
current->data = start->data;
start->data = temp;
}
if (sorted && current->link &¤t->data > current->link->data) // 如果在链表中存在比后一项大的项,则表示未排序
sorted = false;
}
}
}
2013-07-04
展开全部
public void paixu(int a[]){ //首先传入一个数组
Linlist l=new Linlist();
for(int i=0;i<a.length;i++)
l.insert(i,new Integer(a[i]));//用循环调用插入函数插入连表中
//此处添加冒泡法排序代码 //然后再用冒牌法排序
//此处为输出函数代码 //最后再用一个循环输入数组
先实现链表的operator[],再调用
Srot(list,list.Lenght());
template<typename T>
void Sort(T& arrays[],int const& total)
{
int k=n-1;
for(int i=0;i<(n-1);++i)
{
for(int j=0;j<k;++j)
{
if(arrays[j]>arrays[j+1])
{
swap(arrays[j],arrays[j+1]);
}
k--;
}
}
}
Linlist l=new Linlist();
for(int i=0;i<a.length;i++)
l.insert(i,new Integer(a[i]));//用循环调用插入函数插入连表中
//此处添加冒泡法排序代码 //然后再用冒牌法排序
//此处为输出函数代码 //最后再用一个循环输入数组
先实现链表的operator[],再调用
Srot(list,list.Lenght());
template<typename T>
void Sort(T& arrays[],int const& total)
{
int k=n-1;
for(int i=0;i<(n-1);++i)
{
for(int j=0;j<k;++j)
{
if(arrays[j]>arrays[j+1])
{
swap(arrays[j],arrays[j+1]);
}
k--;
}
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-07-04
展开全部
#include<iostream>
using namespace std;
#define NULL 0
struct student
{
int banji;
student *next;
};
int n;
int main()
{
student *creat(void);
void print(student *);
student *paixu(student *);
student *head;
cout<<"input records:"<<endl;
head=creat(); //返回头指针
print(head);
head = paixu(head);
print(head);
return 0;
}
student *creat(void)
{
student *head;
student *p1,*p2;
n=0;
p1=p2=new student;
cin>>p1->banji;
head=NULL;
while(p1->banji!=0)
{
n=n+1;
if(n==1) head=p1;
else p2->next=p1;
p2=p1;
p1=new student;
cin>>p1->banji;
}
p2->next=NULL;
return(head);
}
void print(student *head) //输出链表的函数
{
student *p;
cout<<"Now,These "<<n<<" records are:"<<endl;
p=head;
if(head!=NULL)
do
{
cout<<p->banji;
cout<<endl;
p=p->next;
}while(p!=NULL);
}
student *paixu(student *head)
{
student *q,*tail,*p=(student*)malloc(sizeof(student)),*temp;
p->next=head;
head=p;
tail = NULL;
while(tail!=head->next)
{
p=head;
q=p->next;
while(q->next!=tail)
{
if (p->next->banji > q->next->banji)
{
temp = q->next->next;
p->next=q->next;
p->next->next = q;
q->next = temp;
}
p=p->next;
q=p->next;
}
tail=q;
}
p=head->next;
free(head);
return p;
}
using namespace std;
#define NULL 0
struct student
{
int banji;
student *next;
};
int n;
int main()
{
student *creat(void);
void print(student *);
student *paixu(student *);
student *head;
cout<<"input records:"<<endl;
head=creat(); //返回头指针
print(head);
head = paixu(head);
print(head);
return 0;
}
student *creat(void)
{
student *head;
student *p1,*p2;
n=0;
p1=p2=new student;
cin>>p1->banji;
head=NULL;
while(p1->banji!=0)
{
n=n+1;
if(n==1) head=p1;
else p2->next=p1;
p2=p1;
p1=new student;
cin>>p1->banji;
}
p2->next=NULL;
return(head);
}
void print(student *head) //输出链表的函数
{
student *p;
cout<<"Now,These "<<n<<" records are:"<<endl;
p=head;
if(head!=NULL)
do
{
cout<<p->banji;
cout<<endl;
p=p->next;
}while(p!=NULL);
}
student *paixu(student *head)
{
student *q,*tail,*p=(student*)malloc(sizeof(student)),*temp;
p->next=head;
head=p;
tail = NULL;
while(tail!=head->next)
{
p=head;
q=p->next;
while(q->next!=tail)
{
if (p->next->banji > q->next->banji)
{
temp = q->next->next;
p->next=q->next;
p->next->next = q;
q->next = temp;
}
p=p->next;
q=p->next;
}
tail=q;
}
p=head->next;
free(head);
return p;
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-07-04
展开全部
for(i=0;i<+9;i++)
for(j=i+1;j<9;j++)
if(a[j-1]>=a[j])
{b=a[j-1];a[j-1]=a[j];a[j]=b;}
for(j=i+1;j<9;j++)
if(a[j-1]>=a[j])
{b=a[j-1];a[j-1]=a[j];a[j]=b;}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-07-04
展开全部
你给的结构是按什么排序的? 结构里不是有两个值吗? -。-# 说清楚才能给你编。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询