学习ING

几种排序算法实现分析


合并排序

 

合并排序代码
代码
void merge(int a[],int left,int mid,int right,int b[])
{
    
int i = left;
    
int j = mid +1;
    
int k = left;
    
while(i<=mid&&j<=right)
    {
        
if(a[i]<a[j])
            b[k
++]=a[i++];
        
else
            b[k
++]=a[j++];
       
    }
    
if(i>mid)
        {
            
while(j<=right)
                b[k
++]=a[j++];
        }
        
else
        {
            
while(i<=mid)
                b[k
++]=a[i++];
        }
}
void copy(int a[],int b[],int left,int right)
{
    
for(int i=left;i<=right;i++)
        a[i]
=b[i];
}
void mergeSort(int a[],int left,int right,int len)
{
    
if(left<right)
    {
        
int mid = (left+right)/2;
        mergeSort(a,left,mid,len);
        mergeSort(a,mid
+1,right,len);
        
int * b = new int[len];
        
//将排序后的结果存入b
        merge(a,left,mid,right,b);
        copy(a,b,left,right);
        
//将b中的结果转到a;
        delete[] b;
    }

}


 

快速排序

 

快速排序代码
代码
 1 void swap(int &a,int &b)
 2 {
 3     int buf = a;
 4     a = b;
 5     b = buf;
 6 }
 7 
 8 int partion(int a[],int low,int high)
 9 {
10     int i = low;
11     int j = high+1;
12     int x = a[low];
13     while(true)
14     {
15         while(i<high&&a[++i]<x);
16         while(j>low&&a[--j]>x);
17         if(i>=j)
18             break;
19         swap(a[i],a[j]);
20     }
21     swap(a[j],a[low]);
22     return j;
23 }
24 void quickSort(int a[],int low,int high)
25 {
26     if(low<high)
27     {
28         int q = partion(a,low,high);
29         quickSort(a,low,q-1);
30         quickSort(a,q+1,high);
31     }
32 }


 

插入排序

 

插入排序代码
代码
 1 void swap(int &a,int &b)
 2 {
 3     int buf = a;
 4     a = b;
 5     b = buf;
 6 }
 7 void insertSort(int a[],int len)
 8 {
 9     for(int i = 1;i<len;i++)
10     {
11         for(int j = i;j>0;j--)
12         {
13             if(a[j]<a[j-1])
14                 swap(a[j],a[j-1]);
15             else
16                 break;
17 
18         }
19     }
20 }


 

希尔排序

 

希尔排序代码
代码
#include <math.h>
#include 
<stdio.h>
#include 
<vector>
#include 
<string>
using namespace std;

void swap(int &a,int &b)
{
    
int buf = a;
    a 
= b;
    b 
= buf;
}
int mi(int cnt)
{
    
int s =1;
    
for(int i=1;i<=cnt;i++)
    {
        s
*=2;
    }
    
return s;
}
void hillInsert(int a[],int d,int len)
{
    
for(int i =d;i<len;i++)
    {
        
for(int j=i;j>0;j=j-d)
        {
            
if(a[j]<a[j-d])
            {
                swap(a[j],a[j
-d]);
            }
            
else
                
break;
        }
    }
}
/*
*d是增量序列
*hillCnt是增量序列的长度
*/
void hillSort(int a[],int d[],int hillCnt,int len)
{
    
for(int i=0;i<hillCnt;i++)
    {
        hillInsert(a,d[i],len);
    }
}
void main()
{
    
int a[] = {76,22,33,12,67,45};
    
int len = sizeof(a)/sizeof(int);
    
int hillCnt =log(len+1.0)/log(2.0);
    
int *= new int[hillCnt];
    
for(int i=0;i<hillCnt;i++)
    {
        d[i] 
= mi(hillCnt-i)-1;
    }
    hillSort(a,d,hillCnt,len);
        
for(int i=0;i<len;i++)
    {
        cout
<<a[i]<<endl;
    }

}


 

 冒泡排序

 

 

代码
void swap(int &a,int &b)
{
    
int buf = a;
    a 
= b;
    b 
= buf;
}
void bubbleSort(int a[],int len)
{
    
for(int i=1;i<len;i++)
    {
        
for(int j=0;j<len-i;j++)
        {
            
if(a[j]>a[j+1])
                swap(a[j],a[j
+1]);
        }

    }
}


堆排序

 

堆排序代码
代码
#include "Queue.h"
#include 
"QueueItem.h"
#include 
<math.h>
#include 
<stdio.h>
#include 
<vector>
#include 
<string>
using namespace std;
void swap(int &a,int &b)
{
    
int x = a;
    a 
= b;
    b 
= x;
}
void heapAdjust(int a[],int len,int s)
{
    
    
for(int i=2*s+1;i<len;i=2*i+1)
    {
        
if(i+1<len&&a[i]>a[i+1])i++;
        
if(a[i]>a[s])
            
break;
        swap(a[s],a[i]);
        s 
= i;    
    }

}

void heapSort(int a[],int len)
{
    
for(int i=len/2-1;i>=0;i--)
    {
        heapAdjust(a,len,i);
    }
    
for(int i=0;i<len;i++)
    {
        cout
<<a[i]<<endl;
    }
    
    
for(int i=len;i>=1;i--)
    {
        cout
<<a[0]<<"  "<<a[i-1]<<endl;
        swap(a[i
-1],a[0]);
        heapAdjust(a,i
-1,0);
    }

}
void main()
{
    
int a[] = {76,22,33,12,67,45,24};
    
int len = sizeof(a)/sizeof(int);
    heapSort(a,len);
    
for(int i=0;i<len;i++)
    {
        cout
<<a[i]<<endl;
    }
}


基数排序

 

代码
#include "stdafx.h"

#include 
"Queue.h"
#include 
"QueueItem.h"
#include 
<math.h>
#include 
<stdio.h>
#include 
<vector>
#include 
<string>
using namespace std;
#define MAX_NUM_OF_KEY 8
#define RADIX 10
#define MAX_SPACE 10000

struct SLCell
{
    
int value[MAX_NUM_OF_KEY];
    
int next;
};
struct SLList
{
    SLCell r[MAX_SPACE];
    
int keynum;//一个数包含的位数,最大为8为
    int recnum;//排序数的个数,最大为10000
};
//将每位相同的组合在一起形成单独的链表
void distribute(SLList &r,int index,int f[],int e[])
{
    
int len = r.recnum;
    
for(int i=0;i<RADIX;i++)
        f[i]
=0;//对f进行初始化
    for(int p=r.r[0].next;p;p=r.r[p].next)
    {
        
int j = r.r[p].value[index];
        
if(!f[j])
            f[j]
=p;
        
else
            r.r[e[j]].next 
= p;
        e[j]
=p;
    }

}
//将链表整合在一起
void collect(SLList &r,int index,int f[],int e[])//f中存的每一个队列的首,e是每一个尾
{
    
int j;
    
for(j=0;!f[j];j++);
    r.r[
0].next=f[j];
    
int t = e[j];
    
while(j<RADIX)
    {
        
for(j=j+1;j<RADIX-1&&!f[j];j=j+1);
        
if(j<RADIX&&f[j])
        {
            r.r[t].next
=f[j];
            t
=e[j];
        }
    }
    r.r[t].next 
= 0;

}
void radixSort(SLList &r,int f[],int e[])
{
    
for(int i=0;i<r.keynum;++i)
    {
        distribute(r,i,f,e);
        collect(r,i,f,e);
    }
}

void main()
{
    SLList list;
    
    list.r[
0].next = 1;
    list.r[
1].value[0]=3;
    list.r[
1].value[1]=0;
    list.r[
1].value[2]=2;
    list.r[
1].next = 2;
    list.r[
2].value[0]=3;
    list.r[
2].value[1]=3;
    list.r[
2].value[2]=9;
    list.r[
2].next = 3;
    list.r[
3].value[0]=8;
    list.r[
3].value[1]=8;
    list.r[
3].value[2]=0;
    list.r[
3].next = 4;
    list.r[
4].value[0]=4;
    list.r[
4].value[1]=1;
    list.r[
4].value[2]=7;
    list.r[
4].next = 0;
    list.keynum 
= 3;
    list.recnum 
= 5;
    
int *= new int[RADIX];
    
int *= new int[RADIX];

    
for(int p=list.r[0].next;p;p=list.r[p].next)
    {
        
for(int i =list.keynum-1;i>=0;i--)
        {
            cout
<<list.r[p].value[i];
        }
        cout
<<endl;
    }
    cout
<<"------------------"<<endl;

    radixSort(list,f,e);
    
for(int p=list.r[0].next;p;p=list.r[p].next)
    {
        
for(int i =list.keynum-1;i>=0;i--)
        {
            cout
<<list.r[p].value[i];
        }
        cout
<<endl;
    }
    cout
<<"------------------"<<endl;
    delete[] f;
    delete[] e;
    
    
}


(上述代码均本人编写,经过简单的测试,如有问题,欢迎提出!)


 

 

posted @ 2010-03-23 21:05  祝雄锋  阅读(447)  评论(0编辑  收藏  举报