1. 程式人生 > 實用技巧 >氣泡排序,選擇排序,插入排序的c和python實現

氣泡排序,選擇排序,插入排序的c和python實現

氣泡排序:

  氣泡排序是經典排序演算法之一,時間複雜度為O(n2),基本原理如下列程式註釋:

python實現:

# 氣泡排序
# 一次比較兩個元素,重複走訪
# 數列中最大的數會在多次比較後直接挪到最後,下次比較時不參與
# 因為越小的元素會慢慢'浮'到數列頂端,所以叫做氣泡排序

# 例程

def bubblesort(arr): n = len(arr) for i in range(n): for j in range(0, n-i-1): if arr[j] > arr[j+1]: arr[j], arr[j
+1] = arr[j+1], arr[j]

c實現:

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

對比兩程式可知,其都是通過兩級for迴圈實現氣泡排序功能。在python中,簡化了變數的宣告,並且通過a,b=b,a直接互換了陣列成員。


插入排序:

  (一般按照最壞時間複雜度討論) 時間複雜度為O(n2)。通過c例程,看看它的實現方法。

  首先將 arr[1] 存放在temp中,接著進入下一個for迴圈中,這時,如果 arr[j-1],即 arr[0] 大於temp, arr[0] 中的元素就被放在 arr[1] 中,而之前的 arr[1] 中的元素就被放入了 arr[0] 中。簡單概括:arr[1]與前面的陣列元素進行了比較,大的被放在了後面。小的放在了前面。

  而後,第二個for迴圈到來,這時,i=2,這時我們不難看出,在for (j = i; j > 0 && arr[j - 1] > temp; j--) 這個迴圈中,arr[2] (temp)依次與前面的元素進行比較,如果前面的元素大於 temp , 前面的元素就會向後移動一次,如果前面的元素小於 temp,temp就排在這個元素的後方,這就是“插入”排序的核心意思。(查詢圖片資料更容易理解,這裡略去)

c實現

//插入排序:對於未排序資料,在已排序序列中從後向前掃描,找到相應位置並插入

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

python實現

# 插入排序
def insertionSort(arr):

    for i in range(1, len(arr)):
        key = arr[i]
        j = i-1
        while j >= 0 and key < arr[j]:
            arr[j+1] = arr[j]
            j -= 1
        arr[j+1] = key


選擇排序:

  時間複雜度O(n2)。演算法實現:首先在所有陣列元素中找到最小值,並放在最前方,然後再去掉已排序的最小值陣列元素,接著找剩餘元素的最小值(即“選擇最小值”),放在前方,直到所有元素排序完成。

c實現:

//選擇排序

void swap(int *a, int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}
void selection_sort(int arr[], int len)
{
    int i, j;
    for (i = 0; i < len - 1; i++)
    {
        int min = i;
        for (j = i + 1; j < len; j++)  //走訪未排序程式
        {
            if (arr[min] > arr[j])
                min = j;  //記錄未排序的數的最小值位置
        }
            swap(&arr[i], &arr[min]);  //最小值與arr[i]做交換
    }
}

python實現:

# 選擇排序
# 指定一個元素
# 依次比較,將最小的元素放在第一個
# 然後繼續比較剩下的元素,直至完成排序

# 例程


def seletesort(A):
    for i in range(len(A)):
        min_id = i
        for j in range(i+1, len(A)):
            if A[min_id] > A[j]:
                min_id = j
        #  將i號位與min_id號位的值調換(實際上a,b=b,a是調換了兩者的地址)
        A[i], A[min_id] = A[min_id], A[i]

(部分程式思路參考菜鳥教程官方網站完成)