{希尔排序、快速排序、动态数组、单链表、字符串转整型}大综合

原创 2011年10月17日 15:19:14
#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
#define maxarray 10

typedef struct LNode  //定义单链表节点
{
 int data;
 struct LNode * next;
}LNode,*Linklist;

/*---------------------------------------
函数名:ShellInsert
类型:void
功能:一趟增量为d的直接插入排序
过程:第i趟排序时,将arr[i]插入到已经有序增量为d的(arr[0]..arr[i-1])中
---------------------------------------*/
void ShellInsert(int arr[],int n,int d);

/*---------------------------------------
函数名:ShelllSort
类型:void
功能:希尔排序
过程:按数组d[dj]中元素为增量进行希尔排序
---------------------------------------*/
void ShellSort(int arr[],int n,int d[],int dj);

/*-----------------------------------------
函数类型:void
函数作用:将元素newdata从单链表尾插入至链表L
------------------------------------------*/
void RearInsert(Linklist &L,int newdata);

/*-----------------------------------------
函数类型:void
函数作用:输入数字至单链表L
------------------------------------------*/
void NumToLinklist(Linklist &L,int &dj);

/*-----------------------------------------
函数类型:void
函数作用:将单链表L中数据存入数组
------------------------------------------*/
void LinklistToArray(Linklist L,int d[]);

/*---------------------------------------
函数名:main 
类型:void
功能:主函数
---------------------------------------*/
void main()
{
 int array[maxarray];
 cout<<"随机生成一个数组如下:"<<endl;
 for(int i=0;i<maxarray;i++)
 {
  array[i]=rand()%100; 
  cout<<array[i]<<"\t";
 }
 cout<<"请输入希尔排序递减的间隔组合,例{5,3,2,1}、{6,3,1}..."<<endl;

    int dj=0;

 Linklist L=(Linklist)new(LNode);
    L->next=NULL;

  NumToLinklist(L,dj); //输入数字至单链表

 int *d=new int[dj+1]; //声明间隔数组d[dj]

 cout<<"(2)生成数组d["<<dj+1<<"],将单链表中数据存入数组:";

 LinklistToArray(L,d);  //将单链表中数据存入数组d[dj]

 ShellSort(array,maxarray,d,dj+1);  //希尔排序操作

 cout<<"(3)经过希尔排序,即多趟间隔不同的直接插入排序后,数组如下:"<<endl;
 for(i=0;i<maxarray;i++)
 {
  cout<<array[i]<<"\t";
 }
 cout<<endl;
}


/*---------------------------------------
函数名:ShellInsert的实现
---------------------------------------*/
void ShellInsert(int arr[],int n,int d)
{
 for(int i=d;i<n;i++)
 {
  if(arr[i]<arr[i-d])  //当arr[i]比前面的有序(0..i-1)中最大的值小的时候,需要插入,否则i++,为了节省运算
  {
   int k=arr[i];
   arr[i]=arr[i-d];  //先换一次
   for(int j=i-2*d;arr[j]>k&&j>=0;j-=d)  //找到空之前,所有元素后移
   {
    arr[j+d]=arr[j];
   }
   arr[j+d]=k;  //插空
  }
 }
}


/*---------------------------------------
函数名:ShellSort的实现
---------------------------------------*/
void ShellSort(int arr[],int n,int d[],int dj)
{
 for(int i=0;i<dj;i++)
 {
  ShellInsert(arr,n,d[i]);
 }
}


/*---------------------------------------
函数名:NumToLinklist的实现
---------------------------------------*/
void NumToLinklist(Linklist &L,int &dj)
{
 cout<<"请输入任意个数字,中间用空格隔开,连续两空格默认输入0,按回车结束:"<<endl;
 cout<<"输入的间隔组合为:"<<endl;
 char c;
 int i=0,sum=0;dj=0;
 while((c=getchar())!='\n')
 {
  i++;
  if(c!=' ')
  {
   sum=(c-'0')+sum*10;    //字符数字转整型数字
  }
  else
  {
   RearInsert(L,sum);    //将输入的数字尾插入链表L中
   dj++;
   sum=0;
  }
 }
 RearInsert(L,sum);
 if(i==0)
  cout<<"(1)未输入任何数字,链表为空"<<endl;
 else
 {
  cout<<"(1)共输入了"<<dj+1<<"个数字,并将他们插入了单链表:";
  for(Linklist p=L->next;p->next!=NULL;p=p->next)    //链表循环输出
  {
   cout<<p->data<<"->";
  }
  cout<<p->data<<endl;
 }
}


/*---------------------------------------
函数名:RearInsert的实现
---------------------------------------*/
void RearInsert(Linklist &L,int newdata)
{
 Linklist p=L;
 while(p->next!=NULL)    //寻找尾节点
 {
  p=p->next;
 }
 Linklist k=(Linklist)new(LNode);    //生成新节点
 p->next=k;    //尾插
 k->next=NULL;
 k->data=newdata;
}

/*---------------------------------------
函数名:LinklistToArray的实现
---------------------------------------*/
void LinklistToArray(Linklist L,int d[])
{
 int i=0;
 for(Linklist p=L->next;p->next!=NULL;p=p->next)  //链表循环输出
  {
  d[i]=p->data;
  i++;
  }
  d[i]=p->data;
 for(int j=0;j<=i;j++)    //数组循环输出
  {
   cout<<"d["<<j<<"]="<<d[j]<<" ";
  }
  cout<<endl;
}

C++中将vector转化为动态数组&实现快速排序

STL中的vector相比传统的数组构造方法效率较低但使用起来更方便,尤其在动态数组方面,可以在不知道数组大小的情况下动态地创建所需要的vector,在C++中这是其他所有构造数组的方法都不具备的,但...
  • codingEMIPark
  • codingEMIPark
  • 2017-04-11 14:09:51
  • 868

快速排序 归并排序 堆排序 希尔排序

1 快速排序(QuickSort) 快速排序是一个就地排序,分而治之,大规模递归的算法。从本质上来说,它是归并排序的就地版本。快速排序可以由下面四步组成。 (1) 如果不多于1个数据,直接...
  • chencheng126
  • chencheng126
  • 2014-09-01 20:38:30
  • 597

希尔排序与快速排序

上节讲的归并排序运行速度比简单排序块,但是它需要的空间是原始数组空间的两倍;通常这是一个严重的缺点         希尔排序,希尔排序的时间复杂度是O(N*(logN)^2)。希尔排序是基于插入排序...
  • yubotianxiao
  • yubotianxiao
  • 2016-07-15 16:50:03
  • 694

讲道理,快速排序不是应该比希尔排序更快吗?

但是我写的代码测试出来确实希尔排序比快速排序快得多,这是为什么呢?而且没对快速排序优化之前,两次递归,很容易栈溢出,崩溃 这是为什么呢?上代码: //希尔排序 template void Shel...
  • qq_29143307
  • qq_29143307
  • 2016-06-14 14:16:01
  • 363

希尔排序和快速排序的效率比较

希尔排序和快速排序的效率比较:对于无序数组,【希尔排序】完胜【快速排序】(当然也可能本人算法实现的不好) 用本人写的代码进行测试------------ 100w随即无序数组     希尔排序...
  • wwwfgx1
  • wwwfgx1
  • 2014-01-26 15:55:50
  • 640

各种排序算法的稳定性(冒泡、选择、插入、快速、堆排序、希尔排序等)

首先,排序算法的稳定性大家应该都知道,通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。在简单形式化一下,如果Ai = Aj,Ai原来在位置前,排序后Ai还...
  • lihuacui
  • lihuacui
  • 2017-05-11 11:13:49
  • 215

程序员必知的8大排序(①直接插入排序②希尔排序③简单选择排序④堆排序⑤冒泡排序⑥快速排序⑦归并排序⑧基数排序)

8种排序之间的关系:   1,  直接插入排序    (1)基本思想:在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排 好顺序的,现在要把第n个数插到...
  • Summer_YuXia
  • Summer_YuXia
  • 2016-11-20 14:42:14
  • 1428

常见排序集合(冒泡排序,选择排序,直接插入排序,二分插入排序,快速排序,希尔排序,归并排序)

常见排序集合
  • u011459262
  • u011459262
  • 2015-08-01 21:24:51
  • 1032

排序算法: 冒泡排序, 快速排序,希尔排序,直接插入排序 ,直接选择排序,归并排序,堆排序

几种排序算法分析:     冒泡排序:   冒泡排序的方法排序速度比较慢。   思路:进行n-1排序,第一次排序先找出最小的数字,放在第一个位置,然后在剩余的数字中再找出最小的数字,放在第二个...
  • dahai_881222
  • dahai_881222
  • 2012-08-03 14:36:50
  • 4606

冒泡排序、选择排序、快速排序、插入排序(希尔排序)、堆排序(十大排序)

#include #include #include          void traverse_array(int,int *);     void output_array(int,...
  • sevenquan
  • sevenquan
  • 2015-12-24 11:44:18
  • 869
收藏助手
不良信息举报
您举报文章:{希尔排序、快速排序、动态数组、单链表、字符串转整型}大综合
举报原因:
原因补充:

(最多只允许输入30个字)