在这里推荐一下大神的关于排序算法的博客

https://www.cnblogs.com/onepixel/p/7674659.html

一、交换排序

  1. 冒泡排序
  2. 快速排序

二、插入排序

  1. 直接插入排序
  2. 折半插入排序
  3. 希尔排序

三、选择排序

  1. 简单选择排序
  2. 堆排序

四、归并排序

五、桶排序


一、交换排序

1.冒泡排序

基本思想:
每次比较两个相邻的元素,如果它们顺序错误就把它们交换过来。

/*BubbleSort  冒泡排序*/
void swap(int *a,int *b)
{int *t;t=a;a=b;b=t;
}
void BubbleSort(int R[],int n)   //R[]为要排序数组,n为数组长度
{for(int i=0;i<n-1;i++){for(int j=n-1;j>i;j--)           //从右向左排序{if(R[j]<R[j-1])swap(R[j],R[j-1]);//交换函数 }}
}/*改进冒泡排序*/
void BubbleSort(int R[],int n)
{bool exchange;for(int i=0;i<n-1;i++){exchange=false;for(int j=n-1;j>i;j--)if(R[j]<R[j-1]){swap(R[j],R[j-1]);exchange=true;}if(!exchange)//此处为该改进算法的关键之处,节省了没有交换; return;}}

该程序冒泡排序为从左向右排序

#include<stdio.h>
int main()
{int a[100],i,j,t,n;scanf("%d",&n);for(i=0;i<n;i++)scanf("%d",&a[i]);for(i=0;i<n-1;i++)     //(n-1)次排序 {for(j=0;j<n-i-1;j++)   //从左向右排序     n-i-1是其比较次数 if(a[j]<a[j+1])          //成升序排序 {t=a[j];a[j]=a[j+1];a[j+1]=t;}}for(i=0;i<n;i++)printf("%d ",a[i]);return 0;
}
2.快速排序
/*Quick Sort*/
int partition(int R[],int i,int j)//i为0,j为R.length
{int tmp=R[i];while(i<j){while(i<j&&R[j]>=tmp)//从右向左扫描 j--;R[i]=R[j];while(i<j&&R[i]<=tmp)//从左向右扫描 i++;R[j]=R[i];}R[i]=tmp;//哨兵回到它自己的位置 return i;
}
void QuickSort(int R[],int i,int j)
{int a;if(i<j){i=partition(R,i,j);QuickSort(R,i,a-1);       //对左区间递归排序 QuickSort(R,a+1,j);       //对右区间递归排序 }}

二、插入排序

1.直接插入排序
/*InsertSort*/void InsertSort(int R[],int n){int i,j,tmp;for(i=1;i<n;i++){if(R[i]<R[i-1]){tmp=R[i];j=i-1;do{R[j+1]=R[j];j--;}while(j>=0&&R[j]>tmp);       //在有序区内寻找比tmp小的值,将tmp插入此值的后面 R[j+1]=tmp;}}}
2.折半插入排序
/*BinInsertSort=BinarySearch+InsertSort*/
void BinInsertSort(int R[],int n)
{int i,j,low,high,mid,tmp;for(i=1;i<n;i++){if(R[i]<R[i-1]){tmp=R[i];low=0;high=i-1;while(low<=high){mid=(low+high)/2;if(tmp<R[mid])high=mid-1;elselow=mid+1;}for(j=i-1;j>=mid;j--) //将元素往后移动,为插入元素做准备R[j+1]=R[j];R[mid]=tmp;}}}
3.希尔排序
 /*ShellSort*/void ShellSort(int R[],int n){int i,j,d,tmp;d=n/2;while(d>0){for(i=d;i<n;i++){tmp=R[i];j=i-d;while(j>=0&&tmp<R[j]){R[j+d]=R[j];j=j-d;}R[j+d]=tmp;}d=d/2;}}

三、选择排序

1.简单选择排序
/*simple selection sort  与冒泡排序类似*/
void swap(int *a,int *b)
{int tmp;tmp=a;a=b;b=tmp;
}
void SelectSort(int R[],int n)
{int k;for(int i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++)if(R[j]<R[k])k=j;if(k!=i)swap(R[i],R[k]);}
}
2.堆排序
var len;    // 因为声明的多个函数都需要数据长度,所以把len设置成为全局变量function buildMaxHeap(arr) {   // 建立大顶堆len = arr.length;for (var i = Math.floor(len/2); i >= 0; i--) {heapify(arr, i);}
}function heapify(arr, i) {     // 堆调整var left = 2 * i + 1,right = 2 * i + 2,largest = i;if (left < len && arr[left] > arr[largest]) {largest = left;}if (right < len && arr[right] > arr[largest]) {largest = right;}if (largest != i) {swap(arr, i, largest);heapify(arr, largest);}
}function swap(arr, i, j) {var temp = arr[i];arr[i] = arr[j];arr[j] = temp;
}function heapSort(arr) {buildMaxHeap(arr);for (var i = arr.length - 1; i > 0; i--) {swap(arr, 0, i);len--;heapify(arr, 0);}return arr;
}

四、归并排序

/*MergeSort*/
void Merge(int array[], int left, int m, int right)
{int aux[Max_] = {0};  // 临时数组 (若不使用临时数组,将两个有序数组合并为一个有序数组比较麻烦)int i; //第一个数组索引int j; //第二个数组索引int k; //临时数组索引for (i = left, j = m+1, k = 0; k <= right-left; k++) // 分别将 i, j, k 指向各自数组的首部。{//若 i 到达第一个数组的尾部,将第二个数组余下元素复制到 临时数组中if (i == m+1){aux[k] = array[j++];continue;}//若 j 到达第二个数组的尾部,将第一个数组余下元素复制到 临时数组中if (j == right+1){aux[k] = array[i++];continue;}//如果第一个数组的当前元素 比 第二个数组的当前元素小,将 第一个数组的当前元素复制到 临时数组中if (array[i] < array[j]){aux[k] = array[i++];}//如果第二个数组的当前元素 比 第一个数组的当前元素小,将 第二个数组的当前元素复制到 临时数组中else{aux[k] = array[j++];}}//将有序的临时数组 元素 刷回 被排序的数组 array 中,//i = left , 被排序的数组array 的起始位置//j = 0, 临时数组的起始位置for (i = left, j = 0; i <= right; i++, j++){array[i] = aux[j];}
}// 归并排序
void MergeSort(int array[], int start, int end)
{if (start < end){int i;i = (end + start) / 2;// 对前半部分进行排序MergeSort(array, start, i);// 对后半部分进行排序MergeSort(array, i + 1, end);// 合并前后两部分Merge(array, start, i, end);}
}

五、桶排序

#include<stdio.h>
int main()
{int a[11],i,j,t;for(i=0;i<=10;i++)a[i]=0;for(i=1;i<=5;i++){scanf("%d",&t);a[t]++;}for(i=10;i>=0;i--)for(j=1;j<=a[i];j++)printf("%d ",i);return 0;
}

数据结构排序之“九阳神功”相关推荐

  1. 程序员界的九阳神功与独孤九剑

    想写这篇文章已经很久了,可以说它是我很早以前就思考过的两个理念之一(另一个是"金字塔理论"),希望读过本文的人多多提出你们不同的看法,共同分享. -----------Lycos ...

  2. 基础知识真的是九阳神功吗?

    有不少读者咨询过基础知识相关的问题. 有问怎么能够学好基础知识,有问基础知识到底有什么用,也有直接过来喷我,说工作只有CRUD,基础知识就是忽悠. 当然,也有一种论调说,基础知识就像是编程中的九阳神功 ...

  3. 数据结构---排序算法的总结

    数据结构-排序算法的总结 分类 冒泡排序,时间复杂度O(n x n),空间复杂度O(1),稳定 简单选择排序,时间复杂度O(n x n),空间复杂度O(1),不稳定 希尔排序,时间复杂度O(n^1.3 ...

  4. 数据结构-排序基础代码

    数据结构-排序基础代码 1.快排的递归算法: void QuickSort(int A[],int n){Qsort(A,0,n-1); } void Qsort(int A[],int left,i ...

  5. 数据结构----排序

    ##数据结构--排序 Created with Raphaël 2.1.2选择选择直接选择直接选择堆排序堆排序直接选择堆排序大根堆.小根堆:找出最小(大)的Key Created with Rapha ...

  6. DBA一族九阳神功秘籍

    标签 PostgreSQL , 节假日巡检 , 监控 , 闪回 , flash back query , trigger , event trigger , 回收站 , recycle bin , p ...

  7. 编程基础知识真的是九阳神功吗?

    作者|大飞码字 来源|大飞码字(ID:BigFly1024) 有不少读者咨询过基础知识相关的问题. 有问怎么能够学好基础知识,有问基础知识到底有什么用,也有直接过来喷我,说工作只有CRUD,基础知识就 ...

  8. 【数据结构排序算法系列】数据结构八大排序算法

    排序算法在计算机应用中随处可见,如Windows操作系统的文件管理中会自动对用户创建的文件按照一定的规则排序(这个规则用户可以自定义,默认按照文件名排序)因此熟练掌握各种排序算法是非常重要的,本博客将 ...

  9. 数据结构-排序算法总结与感悟

    数据结构-排序算法总结 一,排序的基本概念 排序:有n个记录的序列{R1,R2,-,Rn},其相应关键字的序列是{K1,K2, -,Kn },相应的下标序列为1,2,-, n.通过排序,要求找出当前下 ...

  10. C++基础-介绍·数据结构·排序·算法

    C++基础-介绍·数据结构·排序·算法 特点 使用方向 RPC Data Struct 数据结构 栈 Stack 内存分配中的栈 队列 List 数组 Array 链表 LinkTable 树 Tre ...

最新文章

  1. Centos7更改root密码
  2. Oracle批量导出AWR报告
  3. idea设置默认maven配置, 避免每次设置maven
  4. spring cloud整合Ribbon
  5. 突破领域边界,探索文创文保新趋势
  6. 国内MySQL技术现状_1024不搬砖,谈谈自己2020剩余两月的学习计划
  7. 【转】DICOM之Print!!!!!!!!!
  8. 如何显示Magento的最新产品
  9. 广度优先搜索——字串变换(洛谷 P1032)
  10. 怎么打开unity tweak tool
  11. 小米路由器r2d_小米路由器R2D固件(路由器刷机更新工具)V2.24.11 免费版
  12. 使用python获取日历信息并制作订阅文件
  13. 数论基础题(1) 费马引理+卡特兰数+Lucas定理+同余方程+扩欧
  14. c语言第七章函数笔记,我的C语学习笔记-C语言教程(七).doc
  15. 记录下微信小程使用websokce的Bug
  16. 最新阿里云服务器和GPU服务器长期优惠活动价格表
  17. 网络安全需要掌握的知识有哪些?
  18. 互联网等三行业跻身VC投资前三甲
  19. 我的世界mod开发(5)做一把无敌的剑
  20. 在ubuntu下安装minigui并搭建开发平台

热门文章

  1. Oracle PL-SQL基础知识
  2. python中quadratic什么意思_quadratic是什么意思_quadratic的翻译_音标_读音_用法_例句_爱词霸在线词典...
  3. java实现清除图片水印_Java 添加、删除PPT文本和图片水印
  4. OSPF虚链路与认证
  5. Android手机ERP开发(一)
  6. 计算几何(圆相关模板) - 2D Geometry 110 in 1! - UVA 12304
  7. Android 贝塞尔曲线的魅力
  8. firefox新标签页背景_如何更改或自定义Firefox的“新标签页”
  9. 解读机械图样——剖视图
  10. Java如何创建参数个数不限的函数