排序算法比较表格

1.冒泡排序算法代码

//array[]为待排序数组,n为数组长度
void BubbleSort(int array[], int n)
{int i, j, k;for(i=0; i<n-1; i++)for(j=0; j<n-1-i; j++){if(array[j]>array[j+1]){k=array[j];array[j]=array[j+1];array[j+1]=k;}}
}

2.选择排序算法代码

//array[]为待排序数组,n为数组长度
void selectSort(int array[], int n)
{int i, j ,min ,k;for( i=0; i<n-1; i++){min=i; //每趟排序最小值先等于第一个数,遍历剩下的数for( j=i+1; j<n; j++) //从i下一个数开始检查{if(array[min]>array[j]){min=j;}}if(min!=i){k=array[min];array[min]=array[i];array[i]=k;}}
}

3.直接插入排序算法代码

//array[]为待排序数组,n为数组长度
void insertSort(int array[], int n)
{int i,j,temp;for( i=1;i<n;i++){if(array[i]<array[i-1]){temp=array[i];for( j=i;array[j-1]>temp;j--){array[j]=array[j-1];}array[j]=temp;}}
}

4.归并排序算法代码

递归实现

//实现归并,并把数据都放在list1里面
void merging(int *list1, int list1_size, int *list2,  int list2_size)
{int i=0, j=0, k=0, m=0;int temp[MAXSIZE];while(i < list1_size && j < list2_size){if(list1[i]<list2[j]){temp[k++] = list1[i++];}else{temp[k++] = list2[j++];}}while(i<list1_size){temp[k++] = list1[i++];}while(j<list2_size){temp[k++] = list2[j++];}for(m=0; m < (list1_size+list2_size); m++){list1[m]=temp[m];}
}
//如果有剩下的,那么说明就是它是比前面的数组都大的,直接加入就可以了
void mergeSort(int array[], int n)
{if(n>1){int *list1 = array;int list1_size = n/2;int *list2 = array + n/2;int list2_size = n-list1_size;mergeSort(list1, list1_size);mergeSort(list2, list2_size);merging(list1, list1_size, list2, list2_size);}
}
//归并排序复杂度分析:一趟归并需要将待排序列中的所有记录
//扫描一遍,因此耗费时间为O(n),而由完全二叉树的深度可知,
//整个归并排序需要进行[log2n],因此,总的时间复杂度为
//O(nlogn),而且这是归并排序算法中平均的时间性能
//空间复杂度:由于归并过程中需要与原始记录序列同样数量级的
//存储空间去存放归并结果及递归深度为log2N的栈空间,因此空间
//复杂度为O(n+logN)
//也就是说,归并排序是一种比较占内存,但却效率高且稳定的算法

迭代实现

void MergeSort(int k[],int n)
{  int i,next,left_min,left_max,right_min,right_max;  //动态申请一个与原来数组一样大小的空间用来存储int *temp = (int *)malloc(n * sizeof(int));  //逐级上升,第一次比较2个,第二次比较4个,第三次比较8个。。。  for(i=1; i<n; i*=2)  {  //每次都从0开始,数组的头元素开始  for(left_min=0; left_min<n-i; left_min = right_max)  {  right_min = left_max = left_min + i;  right_max = left_max + i;  //右边的下标最大值只能为n  if(right_max>n)  {  right_max = n;  }  //next是用来标志temp数组下标的,由于每次数据都有返回到K,  //故每次开始得重新置零  next = 0;  //如果左边的数据还没达到分割线且右边的数组没到达分割线,开始循环  while(left_min<left_max&&right_min<right_max)  {  if(k[left_min] < k[right_min])  {  temp[next++] = k[left_min++];  }  else  {  temp[next++] = k[right_min++];  }  }  //上面循环结束的条件有两个,如果是左边的游标尚未到达,那么需要把  //数组接回去,可能会有疑问,那如果右边的没到达呢,其实模拟一下就可以  //知道,如果右边没到达,那么说明右边的数据比较大,这时也就不用移动位置了  while(left_min < left_max)  {  //如果left_min小于left_max,说明现在左边的数据比较大  //直接把它们接到数组的min之前就行  k[--right_min] = k[--left_max];   }  while(next>0)  {  //把排好序的那部分数组返回该k  k[--right_min] = temp[--next];        }  }  }
}
//非递归的方法,避免了递归时深度为log2N的栈空间,
//空间只是用到归并临时申请的跟原来数组一样大小的空间,并且在时间性能上也有一定的提升,
//因此,使用归并排序是,尽量考虑用非递归的方法。

5.快速排序算法代码

//接口调整
void adjust_quicksort(int k[],int n)
{  quicksort(k,0,n-1);
}
void quicksort(int a[], int left, int right)
{  int i,j,t,temp;  if(left>right)   //(递归过程先写结束条件)return;  temp=a[left]; //temp中存的就是基准数  i=left;  j=right;  while(i!=j)  {  //顺序很重要,要先从右边开始找(最后交换基准时换过去的数要保证比基准小,因为基准                               //选取数组第一个数,在小数堆中) while(a[j]>=temp && i<j)  j--;  //再找右边的  while(a[i]<=temp && i<j)  i++;  //交换两个数在数组中的位置  if(i<j)  {  t=a[i];  a[i]=a[j];  a[j]=t;  }  }  //最终将基准数归位 (之前已经temp=a[left]过了,交换只需要再进行两步)a[left]=a[i];  a[i]=temp;  quicksort(left,i-1);//继续处理左边的,这里是一个递归的过程  quicksort(i+1,right);//继续处理右边的 ,这里是一个递归的过程
}

6.堆排序算法代码

void HeapAdjust(int array[], int s, int n )
{int i,temp;temp = array[s];for(i=2*s;i<=n;i*=2){if(i<n&&array[i]<array[i+1]){i++;}if(temp>=array[i]){break;}array[s]=array[i];s=i;}array[s]=temp;
}
void swap(int array[], int i, int j)
{int temp;temp=array[i];array[i]=array[j];array[j]=temp;
}
void heapSort(int array[], int n)
{int i;for (i=n/2;i>0;i--){HeapAdjust(array,i,n);//从下向上,从右向左调整}for( i=n;i>1;i--){swap(array, 1, i);HeapAdjust(array, 1, i-1);//从上到下,从左向右调整}
}

7.希尔排序算法代码

//下面是插入排序
void InsertSort( int array[], int n)
{int i,j,temp;for( i=0;i<n;i++ ){if(array[i]<array[i-1]){temp=array[i];for( j=i-1;array[j]>temp;j--){array[j+1]=array[j];}array[j+1]=temp;}}
}
//在插入排序基础上修改得到希尔排序
void SheelSort( int array[], int n)
{int i,j,temp;int gap=n;do{gap=gap/3+1; for( i=gap;i<n;i++ ){if(array[i]<array[i-gap]){temp=array[i];for( j=i-gap;array[j]>temp;j-=gap){array[j+gap]=array[j];}array[j+gap]=temp;}}}while(gap>1);  }

8.计数排序算法代码

程序1:
#define NUM_RANGE (100)    //预定义数据范围上限,即K的值void counting_sort(int *ini_arr, int *sorted_arr, int n)  //所需空间为 2*n+k
{  int *count_arr = (int *)malloc(sizeof(int) * NUM_RANGE);  int i, j, k;  //初始化统计数组元素为值为零 for(k=0; k<num_range; k++){  count_arr[k] = 0;  }  //统计数组中,每个元素出现的次数    for(i=0; i<n; i++){  count_arr[ini_arr[i]]++;  }  //统计数组计数,每项存前N项和,这实质为排序过程for(k=1; k<num_range; k++){  count_arr[k] += count_arr[k-1];  }  //将计数排序结果转化为数组元素的真实排序结果for(j=n-1 ; j>=0; j--){  int elem = ini_arr[j];          //取待排序元素int index = count_arr[elem]-1;  //待排序元素在有序数组中的序号sorted_arr[index] = elem;       //将待排序元素存入结果数组中count_arr[elem]--;              //修正排序结果,其实是针对算得元素的修正}  free(count_arr);
}  程序2:C++(最大最小压缩桶数)
public static void countSort(int[] arr) {if (arr == null || arr.length < 2) {return;}int min = arr[0];int max = arr[0];for (int i = 1; i < arr.length; i++) {min = Math.min(arr[i], min);max = Math.max(arr[i], max);}int[] countArr = new int[max - min + 1];for (int i = 0; i < arr.length; i++) {countArr[arr[i] - min]++;}int index = 0;for (int i = 0; i < countArr.length; i++) {while (countArr[i]-- > 0) {arr[index++] = i + min;}
}

9.基数排序算法代码

//基数排序
//LSD  先以低位排,再以高位排
//MSD  先以高位排,再以低位排
void LSDSort(int *a, int n)
{  assert(a);  //判断a是否为空,也可以a为空||n<2返回int digit = 0;   //最大位数初始化for (int i = 0; i < n; ++i)  {   //求最大位数while (a[i] > (pow(10,digit)))  //pow函数要包含头文件math.h,pow(10,digit)=10^digit{  digit++;  }  }  int flag = 1;   //位数for (int j = 1; j <= digit; ++j)  {  //建立数组统计每个位出现数据次数(Digit[n]为桶排序b[n])  int Digit[10] = { 0 };  for (int i = 0; i < n; ++i)  {  Digit[(a[i] / flag)%10]++;  //flag=1时为按个位桶排序}  //建立数组统计起始下标(BeginIndex[n]为个数累加c[n],用于记录重复元素位置//flag=1时,下标代表个位数值,数值代表位置,跳跃代表重复)int BeginIndex[10] = { 0 };  for (int i = 1; i < 10; ++i)  {  //累加个数BeginIndex[i] = BeginIndex[i - 1] + Digit[i - 1];  }  //建立辅助空间进行排序 //下面两条可以用calloc函数实现int *tmp = new int[n];  memset(tmp, 0, sizeof(int)*n);//初始化  //联合各数组求排序后的位置存在temp中for (int i = 0; i < n; ++i)  {  int index = (a[i] / flag)%10;  //桶排序和位置数组中的下标//计算temp相应位置对应a[i]中的元素,++为BeginIndex数组数值加1//跳跃间隔用++来补,先用再++tmp[BeginIndex[index]++] = a[i];  }  //将数据重新写回原空间  for (int i = 0; i < n; ++i)  {  a[i] = tmp[i];  }  flag = flag * 10;  delete[] tmp;  }
}

排序算法比较以及代码展示相关推荐

  1. 十大排序算法思想和代码总结(Python版)

    Table of Contents 一.概述 二.算法简介及代码展示 1.冒泡排序($O(n^2)$) 2.简单选择排序($O(n^2)$) 3.简单插入排序($O(n^2)$) 4.堆排序($O(n ...

  2. python 代码排布_python实现经典排序算法的示例代码

    以下排序算法最终结果都默认为升序排列,实现简单,没有考虑特殊情况,实现仅表达了算法的基本思想. 冒泡排序 内层循环中相邻的元素被依次比较,内层循环第一次结束后会将最大的元素移到序列最右边,第二次结束后 ...

  3. 十大经典排序算法详细总结 图形展示 代码示例

    文章目录 十大经典排序算法详细总结 0.排序算法说明 1.冒泡排序(Bubble Sort) 2.选择排序(Selection Sort) 3.插入排序(Insertion Sort) 4.希尔排序( ...

  4. 手撕代码之七大常用排序算法 | 附完整代码

    点击上方↑↑↑蓝字关注我们~ 「2019 Python开发者日」全日程揭晓,请扫码咨询 ↑↑↑ 0.导语 本节为手撕代码系列之第一弹,主要来手撕排序算法,主要包括以下几大排序算法: 直接插入排序 冒泡 ...

  5. 利用Python实现十大经典排序算法(附代码流程)

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 作者:hustcc 来源:https://github.com/hustcc/JS ...

  6. 动图图解C语言选择排序算法,含代码分析

    C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...

  7. 面试刷题必看!Python中的5大排序算法及其实现代码

    排序是每个 IT 工程师和开发人员必备的知识技能.不仅要通过编程面试,而且要了解算法本身.不同的排序算法完美地展示了算法设计如何对程序的复杂性.速度和效率产生如此大的影响. 让我们来看看排名前5,也是 ...

  8. 十大经典排序算法(动态演示+代码)

    时间复杂度是指程序执行函数或方法的效率常用大写的O表示,比如执行一个循环我们记做O(n),执行一个加法运算或者执行一个if操作我们记为O(1)​. ​ 时间.空间复杂度比较 1 冒泡排序 算法思想: ...

  9. 十大经典排序算法(附代码、动画及改进方案)

    前言说明 十大排序算法可以说是每个程序员最早接触的也是最重要的算法,这一块必须要非常熟练的掌握,应该要理解每种排序的思想,对各个排序的性能的了解也是基础且重要的.为了方便自己和大家学习,决定整合成一篇 ...

最新文章

  1. Centos配置yum为阿里源
  2. “男医生,女护士?”消除偏见,Google有大招
  3. 神州数码使用telnet方式管理交换机
  4. hdu5025 状态压缩广搜
  5. 以太坊源码分析——BlockChain
  6. php要懂函数吗,九个你需要知道的PHP函数和功能
  7. C++ - 构造和析构 2018-01-10
  8. python etree xpath_【Python】爬虫之使用etree进行xpath元素定位
  9. thinkphp [数据分页]
  10. 关于数据中心PUE与计算机节能的探讨
  11. 整理MFC中StretchDIBits()函数
  12. python连接sql server2008_Python 使用 pyodbc 连接 SQL Server 2008
  13. mysql frm myd myi 恢复_恢复 - 如何从.myd,.myi,.frm文件恢复MySQL数据库
  14. vrrp和mstp实现网关冗余备份以及链路的负载均衡
  15. java的栈区 堆区存放什么_简单整理java中的栈内存, 堆内存是什么?
  16. 超过ChatGPT3达到ChatGPT4%90性能的小羊驼来了-Vicuna(校招社招必备,chatgpt风口来了赶紧学起来吧)
  17. 隐私保护技术之差分隐私
  18. 企业CMS网站建设第二课:CMS模版开发——CMS基础设置与栏目管理
  19. 06蚂蚁-高性能Nginx服务器——1.反向代理
  20. 安卓开发仿有道词典和谷歌翻译词典软件在线输入翻译源码下载

热门文章

  1. javascript中动态加载js、vbs脚本或者css样式表
  2. Sharepoint定制的时候应该注意的事项
  3. [收藏] C#面试基础问题
  4. uva 820 Internet Bandwidth
  5. CF540 B 贪心
  6. COGS——T 803. [USACO Hol10] 政党 || 1776: [Usaco2010 Hol]cowpol 奶牛政坛
  7. Spring的javaMail邮件发送(带附件)
  8. 【Linux】VirtualBox安装ubuntu排错LowGraphic
  9. 【转】Android之apk文件签名——keytool 和 jarsigner
  10. 去掉IE的图片工具条