1. 程式人生 > >C資料結構-幾種常見的排序:冒泡,選擇,插入,希爾

C資料結構-幾種常見的排序:冒泡,選擇,插入,希爾

幾種常見的排序

實際開發中,我們最常見到最常使用的排序莫過於:氣泡排序、選擇排序、插入排序和希爾排序。希爾排序其實就是一種特殊的插入排序。
#ifndef ALGORITHM_H
#define ALGORITHM_H

#define ARRAR_SIZEOF(a) ( sizeof((a)) / sizeof((a[0])) )

/**
 * 直接選擇排序
 * @param arr 陣列指標
 * @param size 陣列大小
 */
void select_sort(int arr[], int size)
{
    int i,j,min,tmp;

    for(i = 0; (i < size -1) && flag; i ++)
    {
        min = i;
       
        for(j = i + 1; j < size; j++)
        {
            if(arr[min] > arr[j])
            {
                min = j;
               
            }
        }
        /* 當最小值的下標min與i不相等時才需要交換位置,否則i位置就是最小的 */
        if( i != min)
        {
            tmp = arr[min];
            arr[min] = arr[i];
            arr[i] = tmp;
        }

    }

}

/**
 * 氣泡排序
 * @param arr 陣列指標
 * @param size 陣列大小
 */
void bubble_sort(int arr[], int size)
{
    int i,j,tmp,flag = 1;

    for(i = 0; (i < size - 1) && flag; i++ )
    {
        flag = 0;
        for(j = 0;j < size - 1 - i; j++)
        {
            if(arr[j] > arr[j + 1])
            {
                tmp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = tmp;
                flag = 1;
            }
        }
    }
}

/**
 * 直接插入排序
 * @param arr
 * @param size
 */
void insert_sort(int arr[], int size)
{
    int i,j,tmp;

    for(i = 1; i < size; i++)
    {
        tmp = arr[i];
        for(j = i - 1;j >= 0;j--)
        {
            if(tmp > arr[j])
                break;
            arr[j + 1] = arr[j];

        }
        arr[j + 1] = tmp;
    }
}

/**
 * 希爾排序
 * @param arr
 * @param size
 */
void shell_sort(int arr[], int size)
{
    int i,j,tmp,gap = size;


    do
    {
        gap = gap / 3 + 1;

        for(i = gap; i < size; i += gap)
        {
            tmp = arr[i];
            for(j = i - gap;j >= 0;j -= gap)
            {
                if(tmp > arr[j])
                    break;
                arr[j + gap] = arr[j];

            }
            arr[j + gap] = tmp;
        }
    }
    while(gap > 1);
}



#endif // ALGORITHM