1. 程式人生 > 其它 >資料結構-排序演算法彙總(C語言實現)

資料結構-排序演算法彙總(C語言實現)

氣泡排序

void BubbleSort(int *arr, int len)
{
    int i, j, temp;
    for (i = 0; i < len ; i++)
    {
        Print(arr, len);
        for (j = 0;  j < len-1 ; j++)
        {
            if (arr[j] > arr[j+1])
            {
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
}

選擇排序

void SelectSort(int *arr, int len)
{
    int i, j, temp;
    for (i = 0; i < len ; i++)
    {
        Print(arr, len);
        for (j = i+1;  j < len ; j++)
        {
            if (arr[i] > arr[j])
            {
                temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    }
}

插入排序

void InsertSort(int *arr, int len)
{
    int i, j, temp;
    for (i = 1; i < len ; i++)
    {
        Print(arr, len);
        temp = arr[i];
        for (j = i-1; j >= 0 && arr[j] > temp ; j--)
        {
            arr[j+1] = arr[j];
        }
        arr[j+1] = temp;

    }
}

// or

void insertSort(int arr[], int n)
{
    for(int i=1;i<n;++i)
    {
        int temp = arr[i];
        int j = i-1;
        while(j>=0 && arr[j] > temp)
        {
            arr[j+1] = arr[j];
            j--;
        }
        arr[j+1] = temp;
    }

}

希爾排序

void shellSort(int arr[], int n)
{
    int gap;
    for(gap=n/2;gap>0;gap/=2)
    {
        for(int i=gap;i<n;i++)
        {
            int j;
            int temp = arr[i];
            for(j=i;j>=gap && arr[j-gap] > temp;j-=gap)
            {
                arr[j] = arr[j-gap];
            }
            arr[j] = temp;
            display(arr, n);
        }
    }

}

快速排序

void quickSort(int arr[], int low, int high)
{
    int i=low;
    int j=high;

    int temp = arr[i];
    if(i<j)
    {
        while(i<j)
        {
            while(i<j && arr[j] >= temp) j--;
            if(i<j)
            {
                arr[i] = arr[j];
                i++;
            }
            while(i<j && arr[i] < temp) i++;
            if(i<j)
            {
                arr[j] = arr[i];
                j--;
            }
        }
        arr[i] = temp;
        quickSort(arr, low, i);
        quickSort(arr, i+1, high);
    }
}

歸併排序

void merge(int arr[], int l, int m, int r)
{
    // split
    int n1 = m - l + 1;
    int n2 = r - m;

    int i = 0;
    int arr1[n1];
    while(i<n1)
    {
        arr1[i] = arr[l+i];
        i++;
    }

    int j = 0;
    int arr2[n2];
    while(j< n2)
    {
        arr2[j] = arr[m+1+j];
        j++;
    }
    // merge
    i=0;
    j=0;
    int k=l;

    while(i<n1 && j < n2)
    {
        if(arr1[i] < arr2[j])
        {
            arr[k++] = arr1[i++];
        }else{
            arr[k++] = arr2[j++];
        }
    }
    while(i<n1)
        arr[k++] = arr1[i++];

    while(j<n2)
        arr[k++] = arr2[j++];
}

void mergeSort(int arr[], int l, int r)
{
    if(l<r)
    {
        int m = l + (r-l)/2;
        mergeSort(arr, l, m);
        mergeSort(arr, m+1, r);
        merge(arr, l,m, r);

    }
}

堆排序