排序算法

最近忙着复习找工作,熟悉了下排序算法,动手写了一下,发现有些问题的边界条件还是没有考虑清楚,不过好在调试成功。

不稳定排序:堆排序,快速排序,希尔排序;稳定排序:插入排序,冒泡排序,选择排序,归并排序,基数排序等。

插入排序算法代码:

void InsertSort(int A[],int n)
{
    for(int i=1;i<n;i++)
    {
        int key=A[i];
        int j=i-1;
        while(j>=0 && A[j]>key)
        {
            A[j+1]=A[j];
            j--;
        }
        A[j+1]=key;
    }
}

冒泡排序代码:

void BubbleSort(int data[],int n)
{
    int flag=0;
    for(int i=0;i<n;i++)
    {
        flag=0;
        for(int j=n-1;j>i;j--)
        {
            if(data[j]<data[j-1])
            {
                swap(data[j],data[j-1]);
                flag=1;
            }
        }
        if(flag==0)
            break;
    }

下面是堆排序代码:

#include <iostream>

using namespace std;
//堆筛选函数
//已知H[start~end]中除了start之外均满足堆的定义
//本函数进行调整,使H[start~end]成为一个大顶堆
void HeapAdjust(int H[], int start, int end)
{
    int temp = H[start];
    for(int i = 2*start + 1; i<=end; i*=2)
    {
        //因为假设根结点的序号为0而不是1,所以i结点左孩子和右孩子分别为2i+1和2i+2
        if(i<end && H[i]<H[i+1])//左右孩子的比较
        {
            ++i;//i为较大的记录的下标
        }

        if(temp > H[i])//左右孩子中获胜者与父亲的比较
        {
            break;
        }
        //将孩子结点上位,则以孩子结点的位置进行下一轮的筛选
        H[start]= H[i];
        start = i;
    }
    H[start]= temp; //插入最开始不和谐的元素
}
void HeapSort(int A[], int n)
{
    //先建立大顶堆
    for(int i=n/2; i>=0; --i)
    {
        HeapAdjust(A,i,n-1);
    }
    //进行排序
    for(int i=n-1; i>0; --i)
    {
        //最后一个元素和第一元素进行交换
        swap(A[0],A[i]);
        //然后将剩下的无序元素继续调整为大顶堆
        HeapAdjust(A,0,i-1);
    }
}
int main()
{
    int A[]={4,1,3,2,16,9,10,14,8,7};
    HeapSort(A,10);
    for(int i=0;i<10;i++)
        cout << A[i] << " ";
    return 0;
}

快速排序:

int RandomInRange(int start,int end)
{
    int random=rand()%(end-start+1)+start;
    return random;
}
int Partition(int data[],int length,int start,int end)
{
    if(data==NULL||length<=0||start<0||end>=length)
    {
        cout << "Invaild Parameters" << endl;
        return -1;
    }
    int index=RandomInRange(start,end);
    swap(data[index],data[end]);
    int small=start-1;
    for(index=start;index<=end;index++)
    {
        if(data[index]<data[end])
        {
            ++small;
            if(small!=index)
                swap(data[index],data[small]);
        }
    }
    ++small;
    swap(data[small],data[end]);
    return small;
}
void QuickSort(int data[],int length,int start,int end)
{
    if(start==end)
        return;
    int index=Partition(data,length,start,end);
    if(index>start)
        QuickSort(data,length,start,index-1);
    if(index<end)
        QuickSort(data,length,index+1,end);
}

归并排序代码:

void mergeArray(int a[],int first,int mid,int last,int temp[])
{
    int i=first,j=mid+1;
    int m=mid,n=last;
    int k=0;
    while(i<=m&&j<=n)
    {
        if(a[i]<a[j])
        {
            temp[k++]=a[i++];
        }
        else
            temp[k++]=a[j++];
    }
    while(i<=m)
        temp[k++]=a[i++];
    while(j<=n)
        temp[k++]=a[j++];
    for(int i=0;i<k;i++)
        a[first+i]=temp[i];
}
void mergesort(int a[],int first,int last,int temp[])
{
    if(first<last)
    {
        int mid=(last+first)/2;
        mergesort(a,first,mid,temp);
        mergesort(a,mid+1,last,temp);
        mergeArray(a,first,mid,last,temp);
    }
}

选择排序:

void SelectSort(int data[],int n)
{
    for(int i=0;i<n-1;i++)
    {
        int index=i;
        for(int j=i+1;j<n;j++)
        {
            if(data[j]<data[index])
                index=j;
        }
        if(index!=i)
            swap(data[index],data[i]);
    }
}

希尔排序:

void ShellInsert(int data[],int d,int n)
{
    for(int i=d;i<n;i++)
    {
        int j=i-d;
        int temp=data[i];
        while(j>=0 && data[j]>temp)
        {
            data[j+d]=data[j];
            j-=d;
        }
        if(j!=i-d)
            data[j+d]=temp;
    }
}
void ShellSort(int data[],int n)
{
    int d=n/2;
    while(d>=1)
    {
        ShellInsert(data,d,n);
        d/=2;
    }
}

基数排序:

#define RADIX 10
#define KEYNUM 10   //关键字位数
int GetDigit(int num,int pos)
{
    int temp=1;
    for(int i=0;i<pos-1;i++)
        temp *= 10;
    return (num/temp)%10;
}
void RadixSort(int data[],int n)
{
    int *Radix[10];
    for(int i=0;i<10;i++)
    {
        Radix[i]=(int *)malloc(sizeof(int) * (n + 1));
        Radix[i][0]=0;
    }
    for(int pos=1;pos<=KEYNUM;pos++)
    {
        for(int i=0;i<n;i++)
        {
            int digit=GetDigit(data[i],pos);
            int index=++Radix[digit][0];
            Radix[digit][index]=data[i];
        }
        for(int i=0,j=0;i<10;i++)
        {
            for(int k=1;k<=Radix[i][0];k++)
            {
                data[j++]=Radix[i][k];
            }
            Radix[i][0]=0;
        }
    }
}

 

posted @ 2014-08-28 18:16  Awy  阅读(200)  评论(0编辑  收藏  举报