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;}
阅读全文
0 0
- 3种提高效率的排序
- 提高效率的几种方法
- 提高效率必须改掉的7种习惯
- 提高效率必须改掉的7种习惯
- 选择排序法[提高效率版]
- 提高效率的七个习惯
- 提高效率的几个网站
- 提高效率的秘诀
- 提高效率的秘诀
- 提高效率的方法
- 多线程提高效率的情况
- MATLAB提高效率的函数
- php 提高效率的要点
- 提高效率!
- 提高效率
- 提高效率
- 快速排序在多核中提高效率
- 一些提高效率的xcode快捷键
- 关于正则表达式,关于Python的re模块
- 面试题求一个整数中二进制1的个数
- AutoCAD文档02——常用快捷键
- Android Material Design 之 CoordinatorLayout + CollapsingToolbarLayout
- java面试题,各大企业常见的java笔试题及答案(精华)
- 3种提高效率的排序
- PAT basic 1026
- 8.6晚做题感悟
- PAT basic 1027
- 熟悉STL顺序容器的使用之vector
- PAT basic 1028
- JAVA语言(五)
- eclipse找不到tools.jar下的内容的解决方法
- maven 介绍