3种提高效率的排序

来源:互联网 发布:c语言北京电脑学校 编辑:程序博客网 时间:2024/06/06 18:28

今天说一下 鸡尾酒排序,堆排序和快速排序。

鸡尾酒排序实在冒泡的基础上改进而来的,先说下冒泡排序

#include <stdio.h>// 交换函数void swap (int a[], int i, int j){int tmp = a[i];a[i] = a[j];a[j] = tmp;}// 打印数组void printA (int *a, int len){int i;for (i = 0; i < len; i++){printf ("%4d", a[i]);}printf ("\n");}// 冒泡排序int main(){int a[10] = {9,6,8,0,3,5,2,4,7,1};int len = sizeof(a) / sizeof(a[0]);int i,j;// 外层循环控制轮数,每一轮找出一个最大的树沉底for (i = 0; i < len -1; i++){// 内层循环控制每一轮比较的次数for (j = 0; j < len-1-i; j++){if (a[j] > a[j+1]){swap (a, j, j+1);}}}printA (a, len);return 0;}

下面是鸡尾酒排序,调用了冒泡的一些函数

int main(){int a[10] = {9,6,8,0,3,5,2,4,7,1};int len = sizeof(a) / sizeof(a[0]);int i;int left  = 0;int right = len - 1;while (left < right){// 从左往右找到一个最大的数放到right的位置for (i = left; i < right; i++){if (a[i] > a[i+1]){swap (a, i, i+1);}}right--;     // 从右往左找到一个最小的数放到left的位置for (i = right; i > left; i--){if (a[i-1] > a[i]){swap (a, i, i-1);}}left++;}printA (a, len);return 0;}

下面是堆排序,建立了类似于树结构的,但不是真的建立 

#include <stdio.h>// 交换函数void swap (int a[], int i, int j){int tmp = a[i];a[i] = a[j];a[j] = tmp;}// 打印数组void printA (int *a, int len){int i;for (i = 0; i < len; i++){printf ("%4d", a[i]);}printf ("\n");}// a 代表一个数组// i 代表要调整的结点的下标// len  数组的长度void heapify(int *a, int i, int len){int left = 2 * i + 1;     // 左孩子结点下标int right = 2 * i + 2;    // 右孩子结点下标int max = i;     // 三个节点中最大元素的下标if (left < len && a[left] > a[max])max = left;if (right < len && a[right] > a[max])max = right;if (max != i)   // 当前父节点不是所有结点中最大的元素,需要做调整{swap (a, i, max);heapify (a, max, len);   // 调整被交换的结点}}void heapSort (int *a, int len){// 建堆int i;for (i = len/2 - 1; i >= 0; i--){heapify (a, i, len);}// 排序for (i = len-1; i > 0; i--){swap (a, 0, i);       // 拿堆顶元素与队尾元素进行交换len--;                // 找到一个最大元素以后堆大小减1heapify (a, 0, len);  // 调整堆顶元素}}int main(){int a[10] = {9,6,8,0,3,5,2,4,7,1};int len = sizeof(a) / sizeof(a[0]);heapSort(a, len);printA (a, len);return 0;}


最后是快速排序

#include <stdio.h>// 交换函数void swap (int a[], int i, int j){int tmp = a[i];a[i] = a[j];a[j] = tmp;}// 打印数组void printA (int *a, int len){int i;for (i = 0; i < len; i++){printf ("%4d", a[i]);}printf ("\n");}// 分区操作,返回基准值的下标int partition(int *a, int left, int right){int pivot = a[right];int index = left;   // 如果找到一个比基准值小的元素,与下标为index的元素交换int i;for (i = left; i < right; i++){if (a[i] < pivot){swap (a, i, index);index++;}}swap (a, index, right);return index;   // 基准值所在位置下标}void qSort(int *a, int left, int right){if (left < right){int pivot = partition(a, left, right);  // 进行分区操作,找基准值下标qSort (a, left, pivot-1);     // 对左边部分进行快速排序qSort (a, pivot+1, right);    // 对右边部分进行快速排序}}int main(){int a[10] = {9,6,8,0,3,1,2,4,7,5};int len = sizeof(a) / sizeof(a[0]);qSort (a, 0, len-1);printA (a, len);return 0;}



原创粉丝点击