91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言如何實現經典排序算法

發布時間:2022-08-08 17:47:00 來源:億速云 閱讀:153 作者:iii 欄目:開發技術

本篇內容介紹了“C語言如何實現經典排序算法”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

    一、冒泡排序

    1.原理

    從數組的頭開始不斷比較相鄰兩個數的大小,不斷將較大的數右移,一個循環后,最大數移至最后一位,無序數組規模減一。不斷重復前面動作,知道數組完全有序。

    2.實現

    void swap(int* a, int* b)
    {
        int temp = *a;
        *a = *b;
        *b = temp;
    }
    void bubble_sort(int* arr, int len)
    {
        bool issort = false;
        while (!issort)
        {
            issort = true;//如果有序則直接退出
            for (int i = 1; i < len; i++)
            {
                if (arr[i-1] > arr[i])//不斷比較相鄰兩個數
                {
                    swap(&arr[i - 1], &arr[i]);//將較大的數不斷往右移
                    issort = false;//如果進行了交換則無序
                }
            }
            len--;//無序規模減一
        }
    }

    3.算法分析

    時間復雜度: 最好情況,當數組完全有序,則只需要進行一輪比較,時間復雜度為o(n);最壞情況為完全無序,每次比較后都要將該數移至數組末尾,時間復雜度為o(n ^2);平均時間復雜度為o(n ^2)。

    空間復雜度: 冒泡排序為就地排序,空間復雜度為o(1)。

    穩定排序: 當數字相同時不會改變相對次序。

    二、選擇排序

    1.原理

    數組前面為無序,后面為有序。剛開始全是無序,從中選擇一個最大值與最后一個無序數字進行交換,無序數組規模減一,有序數組規模加一。不斷循環前面操作,直到數組變為有序數組。或者前面為有序數組,后面為無序數組,不斷選擇最小值與無序數組的第一個數交換,前面的有序數組加一,后面的無序數組減一。

    2.實現

    void selection_sort(int* arr, int len)
    {
        int max_index;
        while (len)
        {
            max_index = 0;
            for (int i = 1; i < len; i++)
            {
                if (arr[max_index] < arr[i])
                {
                    max_index = i;//獲取最大值的索引
                }
            }
            swap(&arr[max_index], &arr[len - 1]);//將最大值與最后一個值交換
            len--;//無序規模減一
        }
    }

    3.算法分析

    時間復雜度: 所有的復雜度為每次選擇最大值,不管數字的有序性,時間復雜度都為o(n)+o(n-1)+&hellip;+o(1)=o(n^2)。所以該算法平均復雜度、最好情況、最差情況都為o(n ^2)。

    空間復雜度: 就地排序,空間復雜度為o(1)。

    不穩定性算法: 排序后相同元素的順序可能被打亂。例子:選擇最大進行排序。3,1,2,2* 第一輪排序后 2*,1,2,3 2的相對順序發生了改變。選擇最小進行排序,2*,2,3,1 第一輪排序后1,2,3,2*. 2的相對順序也被打亂。如果增加空間復雜度也能將選擇排序變成穩定性排序。

    三、插入排序

    1.原理

    數組前面為有序,后面為無序,將無序數組中的第一個數不斷插入有序數組中(具體實現為不斷比較相鄰兩數大小,前面一個數大于后一個數,則交換順序,較小的數不斷前移),有序規模增加一,無序規模減小一。或者,數組前面為無序,后面為有序,通過將無序數組的最后一位數字插入有序數組中(具體實現為將無序數組的最后一位與相鄰的有序數組不斷比較,將無序數組不斷右移)。

    2.實現

    void insert_sort(int arr[], int len)
    {
        for (int i = 1; i < len; i++)//i前面為有序
        {
            for (int j = i - 1; j >= 0; j--)//j為有序數的末尾
            {
                bool issort = true;//當數組有序時能夠提前退出
                if (arr[j] > arr[j + 1])//將無序數組的第一個數不斷與有序數組比較
                {
                    swap(&arr[j], &arr[j + 1]);//將無序數字插入有序數組合適的位置
                    issort = false;
                }
                if (issort) break;
            }
        }
    }

    3.算法分析

    時間復雜度: 插入排序和冒泡排序類似,最好情況完全有序則時間復雜度為o(n),最壞情況為完全無序時間復雜度為o(n^2),平均復雜度為o(n ^2)。

    空間復雜度: 就地排序不需要額外空間,空間復雜度為o(1)。

    穩定性排序: 和冒泡排序類似。

    四、希爾排序

    1.原理

    每次選擇一個增量進行分組,增量不斷減小到一(為插入排序),數組不斷變得有序,增量為一時變成完全有序。屬于插入排序的改進,通過增量進行分組,對每一組進行插入排序,相比于插入排序的優勢在于,shell排序能夠大尺度的移動每一組的最小值,而插入排序得挨著進行比較,所以shell排序效率更高。

    增量為6:

    每一組只有兩個數,分別比較兩個數的大小,如64,57交換順序變成57,64,所有的分組比較完后繼續縮減增量。

    C語言如何實現經典排序算法

    增量為3:

    每一組有四個數,總共三組,分別為23,12,53,79;57,9,64,87;24,16,71,97;以增量開始(12開始)遍歷數組,遍歷到12則在第一組中對12進行插入排序,交換23和12的順序;遍歷到9則在第二組對9進行插入排序。。。。遍歷到64對一組中的9,57,64進行插入排序。最后每一組都變得有序。整體有序性變大。

    C語言如何實現經典排序算法

    增量為1:

    對之前排序過的數組進行插入排序,通過前面的步驟數組有序性變大,最后進行插入排序的效率就更高。

    C語言如何實現經典排序算法

    2.實現

    void shell_sort(int* arr, int len)
    {
        int gap = 0; //分組的跨度
        int i = 0;
        int j = 0;
        for (gap = len / 2; gap >= 1; gap /= 2) //分組增量
        {
            for (i = gap; i < len; i++) {  //遍歷每組
                for (j = i - gap; j >= 0; j -= gap)  //對組內進行插入排序
                {
                    if (arr[j] > arr[j + gap])
                    {
                        swap(&arr[j], &arr[j + gap]);
                    }
                }
            }
        }
    }

    3.算法分析

    時間復雜度:最好情況為完全有序o(n),最差情況為完全無序o(n^2),平均復雜度為o(n ^1.3)。

    空間復雜度:該算法為就地排序空間復雜度為o(1)。

    穩定性:shell排序在分組中可能將相同數字劃分成不同的分組,會改變相對順序,屬于不穩定性排序算法。

    “C語言如何實現經典排序算法”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    呼和浩特市| 巧家县| 泾源县| 庐江县| 灌南县| 太谷县| 水富县| 太仆寺旗| 山阴县| 城固县| 芜湖市| 财经| 武平县| 佛山市| 安龙县| 航空| 牡丹江市| 河东区| 翁牛特旗| 濮阳市| 永顺县| 尼勒克县| 沙雅县| 冀州市| 蓬莱市| 孝昌县| 启东市| 页游| 会泽县| 保康县| 泰兴市| 高台县| 金乡县| 惠州市| 永春县| 中卫市| 镇赉县| 冀州市| 株洲县| 丰宁| 南阳市|