首页 > 代码库 > 排序算法

排序算法

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

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

插入排序算法代码:

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=http://www.mamicode.com/=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;        }    }}

 

排序算法