各种排序实现

来源:互联网 发布:java 获取当前locale 编辑:程序博客网 时间:2024/05/16 15:11

冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、基数排序、堆排序的实现:

#ifndef Sort_H_#define Sort_H_#include <iostream>#include <cstring>#include <queue>#include <math.h>#include <conio.h>using namespace std;inline void exchange(int &a,int &b){    int temp=a;    a=b;    b=temp;}void print(int *array,int n){    for(int i=0; i<n; i++)    {        cout<<array[i]<<" ";    }    cout<<endl;}//------------------------------bubbleSort----------------------------------//O(n^2)void bubbleSort(int *array,int n){    for(int i=n-1; i>=0; i--)    {        bool flag=0;        for(int j=0; j<i; j++)        {            if(array[j]>array[j+1])            {                exchange(array[j],array[j+1]);                flag=1;            }        }        if(!flag)break;    }}//-------------------------selectSort------------------------------------//O(n^2)void selectSort(int *array,int n){    for(int i=0; i<n-1; i++)    {        int lowIndex=i;        for(int j=i+1; j<n; j++)        {            if(array[lowIndex]>array[j])            {                lowIndex=j;            }        }        exchange(array[i],array[lowIndex]);    }}//-------------------------insertSort-----------------------------------//O(n^2)void insertSort(int *array,int n){    for(int i=1; i<n; i++)    {        int cur=array[i];        int j;        for(j=i-1; j>=0&&cur<array[j]; j--)        {            array[j+1]=array[j];        }        array[j+1]=cur;    }}//--------------------------------shellSort---------------------------------//maybe O(n^1.5)//修改过的插入排序void shellSortHelp(int *array,int n,int inc){    for(int i=inc; i<n; i++)    {        int cur=array[i];        int j;        for(j=i-inc; j>=0&&cur<array[j]; j-=inc)        {            array[j+inc]=array[j];        }        array[j+inc]=cur;    }}//第一趟将序列分成n/2个长度至多为2的子序列,这时子序列中相邻两个元素下标差n/2//第二趟 n/4//直到增量为1为止,将增量存在inc[]中void shellSort(int *array,int n){    int inc[100];    memset(inc,0,sizeof(inc));    int count=0;    int temp=n;    while(temp/2)    {        temp=temp/2;        inc[count++]=temp;    }    for(int i=0; i<count; i++)    {        shellSortHelp(array,n,inc[i]);    }}//-----------------------------mergeSort-----------------------------------//O(nlogn)void merge(int*array,int *tempArray,int low,int mid,int high){    //操作结果:将有子序列array[low...mid]和array[mid+1,high]归并为新的有序序列array[low...high]    int i,j,k;    //一个从头往后撸,一个从中间往后撸    for(i=low,j=mid+1,k=low; i<=mid&&j<=high; k++)    {        if(array[i]<=array[j])        {            tempArray[k]=array[i];            i++;        }        else        {            tempArray[k]=array[j];            j++;        }    }    //前边没撸完的接着撸完    for(; i<=mid; i++,k++)    {        tempArray[k]=array[i];    }    //后边的    for(; j<=high; j++,k++)    {        tempArray[k]=array[j];    }    //导回去    for(i=low; i<=high; i++)    {        array[i]=tempArray[i];    }}void mergeSortHelp(int *array,int *tempArray,int low,int high){    if(low<high)    {        //2路归并排序        int mid=(low+high)/2;        mergeSortHelp(array,tempArray,low,mid);        mergeSortHelp(array,tempArray,mid+1,high);        merge(array,tempArray,low,mid,high);    }}void mergeSort(int *array,int n){    int *tempArray=new int[n];    mergeSortHelp(array,tempArray,0,n-1);    delete []tempArray;}//O(nlogn)//-----------------------------quickSort---------------------------------int partition(int *array,int low,int high){    while(low<high)    {        while(low<high&&array[high]>=array[low])        {            high--;        }        exchange(array[low],array[high]);        while(low<high&&array[low]<=array[high])        {            low++;        }        exchange(array[low],array[high]);    }    return low;}void quickSortHelp(int *array,int low,int high){    if(low<high)    {        int pivotLoc=partition(array,low,high);        quickSortHelp(array,low,pivotLoc-1);        quickSortHelp(array,pivotLoc+1,high);    }}void quickSort(int *array,int n){    quickSortHelp(array,0,n-1);}//O(d*n)   d is weishu//--------------------------------radixSort----------------------------------------void radixSort(int *array,int n,int d){    queue<int>Q[10];    queue<int>A;    int i,j;    int m1=10;    int m2=1;    for (j=0; j<n; j++)    {        A.push(array[j]);    }    for(i=0; i<d; i++)    {        while(!A.empty())        {            int temp=A.front()%m1/m2;            Q[temp].push(A.front());            A.pop();        }        m1*=10;        m2*=10;        for(j=0; j<10; j++)        {            while(!Q[j].empty())            {                A.push(Q[j].front());                Q[j].pop();            }        }    }    int k=0;    while(!A.empty())    {        array[k++]=A.front();        A.pop();    }}//----------------------------------heapSort-------------------------------------void siftAdjust(int *array,int low,int high){    int adjust,i;//adjust is now to change    for(adjust=low,i=2*low+1; i<=high; i=2*i+1)    {        if(i<high && array[i]<array[i+1]) i++;//cause the right child is biger so point to the right.        if(array[adjust]>=array[i])break;        exchange(array[adjust],array[i]);        adjust=i;    }}void heapSort(int *array,int n){    int i;    for(i=(n-2)/2; i>=0; i--)    {        siftAdjust(array,i,n-1);    }    for(i=n-1; i>0; i--)    {        exchange(array[0],array[i]);        siftAdjust(array,0,i-1);    }}#endif
原创粉丝点击