排序算法(1)

bubble_sort 

比较次数是由数组长度决定,时间会比较长。

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

 selection_sort

注意其中将两个地址上的值交换的swap函数,对不同地址互换赋值很有启发。

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[j] < arr[min]) {
                min = j;
            }
        swap(&arr[min], &arr[i]);
    }
}

insertion_sort

以下这个插入排序的简洁令我意想不到。

首先它成功地在插入这一步做到了最小程度重新赋值数组,另一方面,它利用while的运行条件控制重新赋值的次数。这两点非常重要,也非常巧妙。

key move forwards 是插入排序的本质,同时也体现在了 initialized i = 1。

void insertion_sort(int arr[], int len) {
    int i, j, key;
    for (i = 1; i < len; i++) {
        key = arr[i];
        j = i - 1;
        while (j >= 0 && arr[j] > key) {  ///key move forwards
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j+1] = key;
    }
}
原文地址:https://www.cnblogs.com/porest/p/14100772.html