排序的方法:希爾、冒泡、選擇、快速

2020-08-14 11:06:38

title: 各種排序的方法
date: 2020-01-26 09:12:37
tags: c語言數據結構

插入排序

直接插入排序

第一步:序列中的第一個元素保留,第二個元素和它比較,比它大放在前面,比它小方在後面。

第二步:保留第一第二個元素,第三個與第二個比較,比它大插入到前面,比它小插入到後面。

其他步如第二步一樣,直到排序完成。

c語言程式碼如下:

int insort(int a[],int n)
{
    int i,j;
    for(i=2;i<=n;i++)
    {
        s[0]=s[i];
        j=i-1;
        while(s[0]<s[j])
        {
            s[j+1]=s[j];
            j--;
        }
        s[j+1]=s[0];
    }
    return 0;
}

希爾排序shell

該方法實質上是一種分組插入方法

C語言程式碼如下:

int shsort(int s[], int n)    /* 自定義函數 shsort()*/
{
    int i,j,d;
    d=n/2;    /*確定固定增雖值*/
    while(d>=1)
    {
        for(i=d+1;i<=n;i++)    /*陣列下標從d+1開始進行直接插入排序*/
        {
            s[0]=s[i];    /*設定監視哨*/
            j=i-d;    /*確定要進行比較的元素的最右邊位置*/
            while((j>0)&&(s[0]<s[j]))
            {
                s[j+d]=s[j];    /*數據右移*/
                j=j-d;    /*向左移d個位置V*/
            }
            s[j + d]=s[0];    /*在確定的位罝插入s[i]*/
        }
        d = d/2;    /*增裡變爲原來的一半*/
    }
return 0;
}

選擇排序

選擇排序是一種直觀的排序思想,簡單來說,就是從未排序的數列中找出最小的元素,放在起始地址,接下來在從剩下未排序的數列中選擇次小的元素放在第二位置,

接下來,以此類推

#include <stdio.h>
int main()
{
    int i,j,t,a[11];    //定義變數及陣列爲基本整型
    printf("請輸入10個數:\n");
    for(i=1;i<11;i++)
        scanf("%d",&a[i]);    //從鍵盤中輸入要排序的10個數字
    for(i=1;i<=9;i++)
        for (j=i+1;j<=10;j++)
            if(a[i]>a[j])    //如果前一個數比後一個數大,則利用中間變數t實現兩值互換
            {
                t=a[i];
                a[i]=a[j];
                a[j]=t;
            }
    printf("排序後的順序是:\n");
    for(i=1;i<=10;i++)
        printf("%5d", a[i]);    //輸出排序後的陣列
    printf("\n");
    return 0;
}

快速排序

通過一次排序將要排序的數據分割成獨立的兩部分,將序列分爲兩部分的中間數作爲基準(par),基準左邊的數都要比基準右邊的數要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞回進行,以此達到整個數據變成有序序列。

int qusort(int s[],int start,int end)    //自定義函數 qusort()
{
    int i,j;    //定義變數爲基本整型
    i=start;    //將每組首個元素賦給i
    j = end;    //將每組末尾元素賦給j
    s[0]=s[start];    //設定基準值
    while(i<j)
    {
        while(i<j&&s[0]<s[j])
        j--;    //位置左移
        if(i<j)
        {
            s[i]=s[j];    //將s[j]放到s[i]的位置上
            i++;    //位置右移
        }
        while(i<j&&s[i]<=s[0])
            i++;    //位置左移
        if(i<j)
        {
            s[j]=s[i];    //將大於基準值的s[j]放到s[i]位置
            j--;    //位置左移
        }
    }
    s[i]=s[0];    //將基準值放入指定位置
    if (start<i)
        qusort(s,start,j-1);    //對分割出的部分遞回呼叫qusort()函數
    if (i<end)
        qusort(s,j+1,end);
    return 0;
}

氣泡排序

# include <stdio.h>
int main(void)
{
    int a[] = {900, 2, 3, -58, 34, 76, 32, 43, 56, -70, 35, -234, 532, 543, 2500};
    int n;  //存放陣列a中元素的個數
    int i;  //比較的輪數
    int j;  //每輪比較的次數
    int buf;  //交換數據時用於存放中間數據
    n = sizeof(a) / sizeof(a[0]);  /*a[0]是int型, 佔4位元組, 所以總的位元組數除以4等於元素的個數*/
    for (i=0; i<n-1; ++i)  //比較n-1輪
    {
        for (j=0; j<n-1-i; ++j)  //每輪比較n-1-i次,
        {
            if (a[j] < a[j+1])
            {
                buf = a[j];
                a[j] = a[j+1];
                a[j+1] = buf;
            }
        }
    }
    for (i=0; i<n; ++i)
    {
        printf("%d\x20", a[i]);
    }
    printf("\n");
    return 0;
}