排序算法講解(一)

排序算法無論是在平時生活中還是在ACM-ICPC中都比較常用,也很重要。畢竟,在真正的數據處理過程中如果提前對數據進行有效而良好的排序,那麼數據處理起來將會變得比較簡潔。這裏給大家介紹幾個常用的排序算法。

一、插入排序:

插入排序的過程有一些類似於打撲克。相信絕大多數打過撲克的朋友都有這樣的習慣,每抓一張牌,就要結合手中已有的牌進行分門別類並且按照一定的順序進行排列。這樣,在真正開始打牌的時候由於牌面比較規整,打起牌來會比較容易。我們結合具體實例,看看插入排序的過程是不是很像打撲克時抓牌時的情形:

例如:有這麼一個數組,裏面存了這樣幾個元素:5、9 、4 、2、 3 、10.。  我們用“{ }”代表整個集合,即整副撲克牌。用“ ()”代表已經排好順序的牌,相當於抓在你手中的牌。

首先,抓牌的時候肯定是從頭開始抓,你首先抓到了 5 這張牌。於是5 這張牌就在你的手中了。所以結果爲{(5),9 ,4 ,2 ,3 ,10}。(初始狀態)

然後,你抓下一張牌,抓到了9這張牌,與你手中已有的牌比較之後發現9比5大,所以排在5的後面,此時5,9兩張牌就都在你手裏了。結果爲{(5,9),4 ,2 ,3 ,10}。(第一趟排序)

再往下,你抓到了4這張牌,與你手中已有的牌比較之後發現:4比5小,於是排在了最前面,結果爲:{(4 ,5 ,9),2, 3, 10}。(第二趟排序)

再往下,你抓到了2這張牌,與你手中已有的牌比較之後發現:2比4小,於是2排在了最前面,結果爲:{(2,4, 5, 9),3 ,10}。(第三趟排序)

再往下,你抓到了3這張牌,與你手中已有的牌比較之後發現:3大於2而小於4,於是排在2和4之間,結果爲:{(2, 3, 4, 5, 9),10}。(第四趟排序)

最後,你抓到了最後一張牌10,與你手中已有的牌比較之後發現:它是最大的,於是排在最後面,結果爲:{(2, 3, 4, 5, 9, 10)}。(第五趟排序)

排序結束。

大家可以自己多舉幾個類似的例子,多試幾下就會發現,如果一個數組中有n個元素要進行排序,那麼用插入排序算法,你需要進行n-1趟排序就能完成排序。插入排序在數據量較小的情況下比較實用,效率較高。

代碼:

#include<iostream>
using namespace std;
///插入排序,從a[0]開始儲存數據
void insertSort(int a[],int n) ///a[]代表儲存數據的數組,n代表有幾個元素需要排序
{
    int key = 0,i = 1,j;
    while(i<n)
    {
        key = a[i];  ///key爲臨時變量,用於存儲當前變量a[i];
        j = i-1;
        while(j>=0 && key<a[j])  ///將當前元素放到正確的位置;
        {
            a[j+1] = a[j];
            j = j-1;
        }
        a[j+1] = key; ///找到正確位置後,將當前元素放到j+1的位置
        i++;
    }
}

二、冒泡排序

現實生活中,水中氣泡的重量越輕,就越容易浮上去,冒泡排序的原理類似,我們讓較小的數字“浮上去”,讓較大的數字“沉下去”。冒泡排序的基本思想是:掃描所有的數據,兩兩進行比較,若有違反輕氣泡在上、重氣泡在下原則的情況,則將這兩個數字進行位置交換,讓重氣泡下沉,輕氣泡上浮。

冒泡排序分爲兩個主要步驟:相鄰元素的比較和元素位置的交換。於是,在具體代碼實現的過程中,我們就依照這兩個步驟展開,我們可以寫兩個函數,其中一個爲swap()函數,用來進行元素的交換操作;另一個爲bubbleSort()函數,是整個冒泡排序算法的核心。我們設置一個flag變量,在每趟排序開始的時候,將其設置爲0,一旦本趟排序發生了元素的交換,則flag的值變爲1 。 有元素交換,說明排序還沒有完成,否則排序完成,進而,我們知道,冒泡排序結束的標誌是:已經掃描了所有的元素,並且flag的值爲1 。

#include<iostream>
using namespace std;

void Swap(int* a, int* b)
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}

void bubbleSort(int a[], int n)
{
    int flag;
    int i = 1;
    int j;
    do
    {
        for(j=0;j+1<n;j++)
        {
            if(a[j]>a[j+1])
            {
                Swap(&a[j],&a[j+1]);
                flag = 1;
            }
        }
        i++;
    }while(i<n&&1==flag);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章