十大排序法2

四、快速排序(递归版)

 原理:分治思想,选基准值分区,递归排序。

void quickSort(int arr[], int low, int high) {  

    if (low < high) {  

        int pi = partition(arr, low, high); // 分区函数  

        quickSort(arr, low, pi-1);  

        quickSort(arr, pi+1, high);  

    }  

}  

// 分区函数(取最后一个元素为基准)  

int partition(int arr[], int low, int high) {  

    int pivot = arr[high], i = low-1, j, temp;  

    for (j = low; j < high; j++) {  

        if (arr[j] <= pivot) { // 升序,降序改 >=  

            i++;  

            temp = arr[i]; arr[i] = arr[j]; arr[j] = temp;  

        }  

    }  

    temp = arr[i+1]; arr[i+1] = arr[high]; arr[high] = temp;  

    return i+1; // 基准位置  

}  

 

五、归并排序(递归版) 

原理:分治+合并,先拆分再合并有序子数组。

void merge(int arr[], int l, int m, int r) {  

    int n1 = m - l + 1, n2 = r - m;  

    int L[n1], R[n2], i, j, k;  

    for (i=0; i

    for (j=0; j

    i = j = 0; k = l;  

    while (i < n1 && j < n2) // 合并有序数组  

        arr[k++] = (L[i] <= R[j]) ? L[i++] : R[j++]; // 升序,降序改 >=  

    while (i < n1) arr[k++] = L[i++];  

    while (j < n2) arr[k++] = R[j++];  

}  

void mergeSort(int arr[], int l, int r) {  

    if (l < r) {  

        int m = l + (r-l)/2;  

        mergeSort(arr, l, m);  

        mergeSort(arr, m+1, r);  

        merge(arr, l, m, r);  

    }  

}  

 

六、堆排序

原理:构建大顶堆(或小顶堆),逐个取出堆顶元素。

void heapify(int arr[], int n, int i) {  

    int largest = i, left = 2*i+1, right = 2*i+2, temp;  

    if (left < n && arr[left] > arr[largest]) largest = left; // 大顶堆,小顶堆改 <  

    if (right < n && arr[right] > arr[largest]) largest = right;  

    if (largest != i) {  

        temp = arr[i]; arr[i] = arr[largest]; arr[largest] = temp;  

        heapify(arr, n, largest); // 递归调整子堆  

    }  

}  

void heapSort(int arr[], int n) {  

    int i, temp;  

    // 构建大顶堆(从最后一个非叶子节点开始)  

    for (i = n/2 - 1; i >= 0; i--) heapify(arr, n, i);  

    // 逐个提取堆顶元素  

    for (i = n-1; i > 0; i--) {  

        temp = arr[0]; arr[0] = arr[i]; arr[i] = temp; // 交换堆顶和末尾  

        heapify(arr, i, 0); // 调整剩余元素为堆  

    }  

}

你可能感兴趣的:(c语言)