排序

void bubble_sort(int arr[],int n)//冒泡排序接口 
{
    for(int i = 0;i < n;i++)
    {
        int flag = 0;
        for(int j = 0;j < n-i-1;j++)
        {
            if(arr[j] > arr[j+1])
            {
                swap(arr[j],arr[j+1]);
                flag = 1;
            }
        }
        if(!flag)    break;
    }
}

void insert_sort(int arr[],int n)//插入排序接口 
{
    for(int i = 1;i < n;i++)
    {
        int t = arr[i],j;
        for(j = i;j > 0 && arr[j-1] > t;j--)    arr[j] = arr[j-1];
        arr[j] = t;
    } 
}

void select_sort(int arr[],int n)//选择排序接口 
{
    for(int i = 0;i < n;i++)
    {
        int t = i;
        for(int j = t+1;j < n;j++)
        {
            if(arr[t] > arr[j])    t = j;
        }
        swap(arr[i],arr[t]);
    }
}

void shell_sort(int arr[],int n)//希尔排序接口 
{
    for(int gap = n/2;gap > 0;gap /= 2)
    {
        for(int i =gap;i < n;i++)
        {
            int t = arr[i],j;
            for(j = i-gap;j >= 0 && arr[j] > t;j -= gap)    arr[j+gap] = arr[j];
            arr[j+gap] = t;
        }
    }
}

void merge(int a[],int first,int mid,int last,int temp[])//合并
{
    int i = first,j = mid+1,k = 0;
    while (i <= mid && j <= last)
    {
        if(a[i] < a[j])    temp[k++] = a[i++];
        else    temp[k++] = a[j++];   
    }
    while (i <= mid)    temp[k++] = a[i++]; 
    while (j <= last)    temp[k++] = a[j++];
    for(i = 0;i < k;i++)    a[first+i] = temp[i];
}

void _merge_sort(int arr[],int temp[],int first,int last)//归并 
{
    if(first < last)
    {
        int mid = (first+last)/2;
        _merge_sort(arr,temp,first,mid);
        _merge_sort(arr,temp,mid+1,last);
        merge(arr,first,mid,last,temp);
    }
}

void merge_sort(int arr[],int n)//归并排序接口
{
    int* temp = (int*)malloc(n*sizeof(int));
    if(temp == NULL)
    {
        printf("内存不足\n");
        return;
    }
    _merge_sort(arr,temp,0,n-1);
    free(temp);
}

void percdown(int arr[],int p,int n)//调整最大堆 
{ 
    int Parent,Child,x = arr[p];
    for(Parent = p;Parent*2+1 < n;Parent = Child)
    {
        Child = Parent*2+1;
        if(Child != n-1 && arr[Child] < arr[Child+1])    Child++;
        if(x >= arr[Child])    break;
        else    arr[Parent] = arr[Child];
    }
    arr[Parent] = x;
}

void heap_sort(int arr[],int n)//堆排序接口 
{
    for(int i = n/2-1;i >= 0;i--)    percdown(arr,i,n);
    for(int i = n-1;i > 0;i--)
    {
        swap(arr[0],arr[i]);
        percdown(arr,0,i);
    }
}
void _quick_sort(int arr[],int l,int r)//快速排序
{
    if(l < r)
    {
        int i = l,j = r,x = arr[l];
        while(i < j)
        {
            while(i < j && arr[j] >= x)    j--;
            if(i < j)    arr[i++] = arr[j];
            while(i < j && arr[i] < x)    i++; 
            if(i < j)    arr[j--] = arr[i];
                            
        }
        arr[i] = x;
        _quick_sort(arr,l,i-1);
        _quick_sort(arr,i+1,r);
    }
} 

void quick_sort(int arr[],int n)//快速排序接口 
{
    _quick_sort(arr,0,n-1);
} 

int main()
{
    int arr[]={3,6,1,9,4,2,0,5,8,7};
    int len=sizeof(arr)/sizeof(arr[0]);
    quick_sort(arr,len);
    int i=0;
    for(i=0;i<len;i++){
        printf("%d ",arr[i]);
    }
    printf("\n");
    return 0;
}
各种排序

 

 

posted @ 2016-11-01 20:38  zzzzzzzzhu  阅读(175)  评论(0编辑  收藏  举报