激情依旧 发表于 2005-8-25 07:40

[排序算法]

<P><B>这个是热情的写的。我顺便拿他的来用。其他就是我写的了。整理成一个贴子算了
二路归并
</B>#include&lt;iostream&gt;
using namespace std;</P>
<P>template &lt;typename T&gt;struct Node{
T  key;</P>
<P>};
template &lt;typename T&gt;class Orderedlist{
int maxsize;
int last;
Node&lt;T&gt; slist[100];
public:
Orderedlist(){last=0;maxsize=100;}
int Length() const{return last+1;}//计算表长度
void Mergesort();
void MergePass(Node&lt;T&gt; *b,int len);
void Merge(Node&lt;T&gt; *b,int low,int mid,int high);
bool Insert(Node&lt;T&gt; &amp; elem,int i);
void print();

};
template &lt;typename T&gt; bool Orderedlist&lt;T&gt;::Insert(Node&lt;T&gt; &amp; elem ,int i){
if (i&lt;0||i&gt;last+1||last==maxsize-1) return false;
else{
  for (int j=last;j&gt;i;j--) slist[j]=slist[j-1];
  slist[i]=elem;
  last++;
  return true;
}
}
template &lt;typename T&gt; void Orderedlist&lt;T&gt;::print(){
int i;
for(i=0;i&lt;last;i++){
  cout&lt;&lt;slist[i].key&lt;&lt;'\t';
  if(i%8==7) cout&lt;&lt;endl;
}
cout&lt;&lt;endl;
}
template&lt;typename T&gt; void Orderedlist&lt;T&gt;::Mergesort(){
int len=1;
Node&lt;T&gt; b[100];
while(len&lt;last){
  MergePass(b,len);
  len=2*len;
  for(int i=0;i&lt;last;i++) slist[i]=b[i];
}
}
template &lt;typename T&gt; void Orderedlist&lt;T&gt;::MergePass(Node&lt;T&gt; *b,int len){
int i,j;
i=0;
while(i+2*len&lt;last){
  Merge(b,i,i+len-1,i+2*len-1);
  i= i+2*len;     
}
if(i+len&lt;last) Merge(b,i,i+len-1,last-1);
else for(j=i;j&lt;last;j++)  b[j]=slist[j];
}
template &lt;typename T&gt; void Orderedlist&lt;T&gt;::Merge(Node&lt;T&gt; *b,int low,int mid,int high){
int i,j,k;
i=low;
j=mid+1;
k=low;
while((i&lt;=mid)&amp;&amp;(j&lt;=high)){
  if(slist[i].key&lt;=slist[j].key) b[k++]=slist[i++];//取小者复制
  else  b[k++]=slist[j++];
}
while(i&lt;=mid) b[k++]=slist[i++];//复制第一个文件的剩余元素
while(j&lt;=high) b[k++]=slist[j++];//复制第二个文件的剩余元素
}</P>
<P>void main(){
const int h=5;
int i;
Orderedlist&lt;int&gt; ordlist;
int a[h]={5,4,3,2,1};
Node&lt;int&gt; n[h];
for(i=0;i&lt;h;i++)  n[i].key=a[i];
for(i=0;i&lt;h;i++)  ordlist.Insert(n[i],i); //建立顺序表
cout&lt;&lt;"未排序表:"&lt;&lt;endl;
ordlist.print();
ordlist.Mergesort();
cout&lt;&lt;"已排序表:"&lt;&lt;endl;
ordlist.print();
}
----------------------------------------------------------------------------------------------
</P>
<P>堆排序
#include&lt;stdio.h&gt;
void CreatHeap(int a[],int n,int h)
{   int i,j,flag,temp;
     i=h;
  j=2*i+1;
  temp=a[i];
  flag=0;
  while(j&lt;n &amp;&amp; flag!=1)
  {  if(j&lt;n-1 &amp;&amp; a[j]&lt;a[j+1]) j++;
      if(temp&gt;a[j])
    flag=1;
   else
   {  a[i]=a[j];
      i=j;
   j=2*i+1;
   }
  }
   a[i]=temp;
}
void InitCreatHeap(int a[],int n)
{   int i;
    for(i=(n-1)/2;i&gt;=0;i--)
  CreatHeap(a,n,i);
}
void HeapSort(int a[],int n)
{   int i,temp;
    InitCreatHeap(a,n);
for(i=n-1;i&gt;0;i--)
{  temp=a[0];
    a[0]=a[i];
    a[i]=temp;
    CreatHeap(a,i,0);
}</P>
<P>}
main()
{  int n,i,a[100];
   printf("请问你要输入几个排序数:\n");
   scanf("%d",&amp;n);
   printf("请输入你要排序的数值:\n");
   for(i=0;i&lt;n;i++)
    scanf("%d",&amp;a[i]);
   HeapSort(a,n);
   printf("排序后的:\n");
   for(i=0;i&lt;n;i++)
    printf("%d\t",a[i]);
}
-------------------------------------------------------------
对半排序
#include&lt;stdio.h&gt;
main()
{  int i,j,temp, low,high,mid,a[100],n;
  printf("请问你要输入几个数字:\n");
   scanf("%d",&amp;n);
   printf("请输入数字:\n");
   for(i=0;i&lt;n;i++)
    scanf("%d",&amp;a[i]);
  for(i=1;i&lt;n;i++)
  { temp=a[i];
    low=0;
high=i-1;
while(high&gt;=low)
{   mid=(low+high)/2;
    if(temp&lt;a[mid]) high=mid-1;
    else
     low=mid+1;
}
for(j=i-1;j&gt;=low;j--)
  a[j+1]=a[j];
a[low]=temp;
  }
     printf("排序后的:\n");
     for(i=0;i&lt;n;i++)
    printf("%d\t",a[i]);
}
---------------------------------------------
快速排序
#include&lt;stdio.h&gt;
void QuickSort(int a[],int low,int high){
int i=low,j=high;
int temp=a[low];
while(i&lt;j)
  {
   while(j&gt;i&amp;&amp;temp&lt;=a[j])
    j--;
      if(j&gt;i)
   {
    a[i]=a[j];
        i++;
   
   }
   while(j&gt;i&amp;&amp;a[i]&lt;temp)
    i++;
   if(j&gt;i)
   {
         a[j]=a[i];
   j--;
   }
  }
  a[i]=temp;
  if(low&lt;i) QuickSort(a,low,i-1);
  if(i&lt;high)QuickSort(a,j+1,high);
}
main()
{ int a[100];
  int  high ,low,i,n;
  printf("请问你要输入几个数字:\n");
   scanf("%d",&amp;n);
   printf("请输入数字:\n");
   for(i=0;i&lt;n;i++)
      scanf("%d",&amp;a[i]);
  low=0;
  high=n-1;
  QuickSort(a,low,high);
  printf("排序后的:\n");
  for( i=0;i&lt;n;i++)
   printf("%d\t",a[i]);
}
--------------------------------------
冒泡
#include&lt;stdio.h&gt;
main()
{int i,j,temp,n,a[100],flag=1;
   printf("请问你要输入几个排序数:\n");
   scanf("%d",&amp;n);
   printf("请输入你要排序的数值:\n");
   for(i=0;i&lt;n;i++)
    scanf("%d",&amp;a[i]);
  for(i=0;i&lt;n&amp;&amp;flag==1;i++)
  {    flag=0;
   for(j=1;j&lt;n-i;j++)
    if(a[j]&lt;a[j-1])
    {    flag=1;
     temp=a[j-1];
        a[j-1]=a[j];
     a[j]=temp;
    }
  }
  printf("排序后的:\n");
  for(i=0;i&lt;n;i++)
  printf("%d\t",a[i]);
}
---------------------------------------------------------
希尔
#include&lt;stdio.h&gt;
void ShellSort(int a[],int n,int d[],int numOfD)
{   int i,j,k,m,span,temp;
    for(m=0;m&lt;=numOfD;m++)
{  span=d[m];
    for(k=0;k&lt;span;k++)
    {  for(i=k;i&lt;n-span;i=i+span)
       {
     temp=a[i+span];
     j=i;
     while(j&gt;-1&amp;&amp;temp&lt;=a[j])
     {  a[j+span]=a[j];
        j=j-span;
     }
     a[j+span]=temp;
    }
    }
}</P>
<P>}
main()
{int a[100], b[10],n,i,k,j;
  printf("请问你要输入几个数字:\n");
   scanf("%d",&amp;n);
   printf("请输入数字:\n");
   for(i=0;i&lt;n;i++)
      scanf("%d",&amp;a[i]);
    j=n;
k=0;
   do{
     j=j/2;
  b[k]=j;
  k++;
   }while(j&gt;0);
     ShellSort(a,n,b,k);
      printf("排序后的:\n");
      for(i=0;i&lt;n;i++)
   printf("%d\t",a[i]);
}
---------------------------------------------
选择排序

#include&lt;stdio.h&gt;
main()
{int a[100], min,i,k,temp,j,cout;
  printf("请问你要输入几个数字(不要超过100个!!):\n");
   scanf("%d",&amp;cout);
   printf("请输入数字:\n");
   for(i=0;i&lt;cout;i++)
    scanf("%d",&amp;a[i]);
for(i=0;i&lt;cout;i++)
   {
  min=i;
  for(k=i+1;k&lt;cout;k++)
  {
   if(a[min]&gt;a[k])
   {
    min=k;
      
   }
   
  }if(i!=min)
  {
   temp=a[i];
   a[i]=a[min];
   a[min]=temp;
  }
   }
for(j=0;j&lt;cout;j++)
  printf("%d\t",a[j]);
}
------------------------------------------
直接插入
#include&lt;stdio.h&gt;
main()
{ int i,j,n,temp,a[100];
   printf("请问你要输入几个数字:\n");
   scanf("%d",&amp;n);
   printf("请输入数字:\n");
   for(i=0;i&lt;n;i++)
      scanf("%d",&amp;a[i]);
   for(i=0;i&lt;n-1;i++)
   {  j=i;
      temp=a[i+1];
      while(temp&lt;a[j]&amp;&amp;j&gt;-1)
   {   a[j+1]=a[j];
        j--;
   }
   a[j+1]=temp;
   }
      printf("排序后的:\n");
      for(i=0;i&lt;n;i++)
    printf("%d\t",a[i]);
}



有什么问题就说出来。我好更改。</P>[em01][em01][em01][em01]
[align=right][color=#000066][此贴子已经被作者于2005-8-25 7:41:05编辑过][/color][/align]

weiweiqiao 发表于 2005-8-27 22:50

收到。。。研习中。。。。

doudou2005 发表于 2005-8-29 21:56

<P>各位高手哥哥,姐姐,请帮帮我吧,有一个基数排序的问题,用c或c++做,需要两天之内完成,我不太明白数据结构的算法,请各位高手一定帮忙,谢谢啦!</P><P>题目:有一个由红,白,蓝三色条块组成的序列,编写  O(n)算法,使得这些条块按红,白,蓝的顺序排好.</P>[em06]

type_error 发表于 2005-9-29 21:23

写的不错,自己写的还是抄的?

gaoshikao 发表于 2005-10-1 03:25

值的参考

olivezhang 发表于 2005-10-11 13:01

Thank you !

激情依旧 发表于 2005-10-20 13:06

    算法当然是书上的。但是代码就是我自己写的了。[em01]

zhouxvan 发表于 2005-10-21 21:51

是用.net写的吧!?

激情依旧 发表于 2005-10-25 21:51

   恩。是.net写的。[em01]

hsjljh 发表于 2005-10-27 21:25

不错啊 就是有点看不懂 努力吧

小悟空 发表于 2005-11-1 14:00

不错啊~~~!!!

unicorn 发表于 2005-11-3 22:12

不错 好东西啊<BR>借鉴一下...谢了 [em12]

ElfDN 发表于 2005-11-13 15:07

要学就学快排,第一次学的人先学下冒泡的想法

rainlily0315 发表于 2005-11-24 19:16

<P>好啊 </P>

newboss 发表于 2005-12-1 09:50

<P>感谢!!!</P>

sailer 发表于 2005-12-1 17:11

谢谢

我漫漫欣赏分析消化啦。<BR>总之,多谢!!!!

chenpengyu 发表于 2005-12-7 14:25

楼主,你的快排没有考虑退化的情况。

jiangsiqi 发表于 2005-12-7 22:26

Good!

梧桐 发表于 2005-12-10 15:26

[em34]<BR><FONT color=#3809f7><STRONG>谢谢楼主的代码<BR></STRONG></FONT><BR><FONT color=#1111ee><STRONG>可以转换为C代码吗?<BR><BR></STRONG></FONT>

hlstone 发表于 2005-12-13 22:57

好东西,正好周末考试用的上<BR>,省得我自己望电脑上打了再测试了<BR>呵呵<BR>谢了<BR>我收藏了~~~~~~~~~·

页: [1] 2

编程论坛