排序算法总结 比眉伴天荒 2022-05-18 09:36 203阅读 0赞 # 冒泡排序 # 时间复杂度为O(n2),最好情况下为O(n),空间复杂度为O(1)。稳定的 冒泡排序总结: void swap(int &a,int &b) { int temp=a; a=b; b=temp; } void buble_sort1(int A[],int n) { for(int i=0;i<n-1;++i) { for(int j=i+1;j<n;j++) { if(A[i]>A[j]) swap(A[i],A[j]); } } } //正宗的冒泡排序实现版本。 //对于n个数来说,总共需要经过n-1次扫描可以使其有序,一趟扫描使一个元素归位 void buble_sort2(int A[],int n) { for(int i=n-1;i>0;--i) { for(int j=0;j<i;++j) { if(A[j]>A[j+1]) //不断的比较相邻的元素,一趟扫描会使得最大位置的元素归位置 swap(A[j],A[j+1]); } } } //对于版本2的改进 如果原序列中后一段是顺序的即不用便利 增加一个flag来区分 void buble_sort3(int A[],int n) { bool flag=false; for(int i=n-1;i>0&&flag;--i) //flag=true 说明当前待排序的部分已经是有序的,不用在进行扫描 { flag=true; for(int j=0;j<i;++j) { if(A[j]>A[j+1]) { swap(A[j],A[j+1]); flag=false; } } } } # 归并排序 # 时间复杂度为O(nlogn),空间复杂度为O(n)。稳定的 归并排序总结: void merge(vector<int>&vec,int lo,int mid,int hi) { vector<int> temp=vec; int i=lo; int j=mid+1; int k=lo; while(i<mid&&j<hi) { if(temp[i]<=temp[j]) vec[k++]=temp[i++]; else vec[k++]=temp[j++]; } while(i<=mid) { vec[k++]=temp[i++]; } while(j<=hi) { vec[k++]=temp[i++]; } } void mergesort(vector<int> &vec,int lo,int hi) { if(lo<hi) { int mid=hi+(hi-lo)/2; mergesort(vec,lo,mid); mergesort(vec,mid+1,hi); merge(vec,lo,mid,hi); } } # 插入排序 # 最好情况下为O(n),最坏以及平均情况下为O(n^2),空间复杂度为O(1)。是稳定的 将整个序列分成两个部分有序的前缀,和无序的后缀, 通过迭代,反复地将后缀首元素转移至前缀中。 void insertsort(vector<int> &vec) { int i ,j; for(int i=1;i<vec.size();i++) { if(vec[i]<vec[i-1]) { int temp=vec[i];//temp 存放待排序的节点 for(j=i-1;j>=0&&vec[j]>temp;--j) vec[j+1]=vec[j]; //把比temp大的部分向前移动 vec[j+1]=temp; } } } # 选择排序 # 最好情况下为、最坏以及平均情况下为O(n^2),空间复杂度为O(1)。不是稳定的 //选择排序 在要排序的一组数中选择最小的一个与第一个交换,再在后面中选出最小的 与第二个交换,如此迭代下去直到全部有序。 void selectsort(vector<int> &vec) { int temp=0; for(int i=0;i<vec.size()-1;++i) { int min=i;//记录需要放置最小元素的位置 for(int j=i+1;j<vec.size();++j) { if(vec[j]<vec[min]) min=j; } if(min!=i) //此时需要交换 { temp=vec[i]; vec[i]=vec[min]; vec[min]=temp; } } } # 快速排序 # 最坏情况下为O(n^2),最好以及平均情况下为O(nlogn)。空间复杂度为O(1)。 int partition(int lo,int hi,vector<int> &vec) { int temp=vec[lo]; while(lo<hi) { while((lo<hi)&&temp<=vec[hi]) --hi; vec[lo]=vec[hi]; while((lo<hi)&&temp>vec[lo]) ++lo; vec[hi]=vec[lo]; } //退出时lo=hi //基准归位 vec[lo]=temp; return lo; } void quicksort(vector<int> &vec,int lo,int hi) { if(lo<=hi) return; //单元素自然有序 int mi=partition(lo,hi,vec); //选择基准点 quicksort(vec,lo,mi-1); //前缀递归 quicksort(vec,mi+1,hi); //后缀递归 }
相关 排序算法总结 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。 我们这里说说八 ﹏ヽ暗。殇╰゛Y/ 2022年07月15日 22:38/ 0 赞/ 177 阅读
相关 算法-排序算法总结 冒泡排序 朴素冒泡排序 反复扫描待排序序列,在扫描的过程中顺次比较相邻的两个元素的大小,若逆序就交换位置。第一趟,从第一个数据开始,比较相邻的两个数据,(以升序为例 短命女/ 2022年06月09日 01:58/ 0 赞/ 289 阅读
相关 排序算法总结 冒泡排序 时间复杂度为O(n2),最好情况下为O(n),空间复杂度为O(1)。稳定的 冒泡排序总结: void swap(int &a,int 比眉伴天荒/ 2022年05月18日 09:36/ 0 赞/ 204 阅读
相关 排序算法总结 排序算法总结 <table> <thead> <tr> <th align="center">排序算法</th> <th align="cent ╰半橙微兮°/ 2022年04月12日 08:57/ 0 赞/ 197 阅读
相关 排序算法总结 1.插入排序算法(附伪代码和C源码) 插入排序原理:从第i=2位开始到数组长度|A|截至。将当前i的值key取出来,从i开始从后往前\[1, i-1\]寻找小于(大 淩亂°似流年/ 2022年01月06日 04:09/ 0 赞/ 281 阅读
相关 排序算法总结 最近在看左神的算法视频,随便记录下自己的学习心得,方便以后review,也让大家对基本的排序算法有个了解。 冒泡排序 > 冒泡排序(英语:Bubble Sort)是一种 红太狼/ 2022年01月06日 01:51/ 0 赞/ 314 阅读
相关 排序算法总结 O(n2)的冒泡,选择,插入,先不贴,先贴归并,快排,堆排, O(nlog(n)) 归并排序 二路归并递归写法:时间O(nlog(n)),稳定,总时间O(nlog),空间 分手后的思念是犯贱/ 2021年12月21日 01:21/ 0 赞/ 262 阅读
相关 排序算法总结 1.冒泡排序 > 冒泡算法思想: > 1.从左到右依次比较相邻的元素。如果第一个比第二个大,就交换他们两个,等全部执行完,最后的元素就是最大的数,这 今天药忘吃喽~/ 2021年12月13日 15:01/ 0 赞/ 286 阅读
相关 排序算法总结 常见排序算法评估 时间复杂度 O(n2):冒泡排序、选择排序、插入排序 O(nlogn):归并排序、快速排序、堆排序、希尔排序 O(n):计数排序、基数排序 ╰半橙微兮°/ 2021年12月13日 14:13/ 0 赞/ 302 阅读
相关 排序算法总结 2019-07-20 import java.net.Socket; import java.util.Arrays; import java.uti 超、凢脫俗/ 2021年11月19日 14:54/ 0 赞/ 335 阅读
还没有评论,来说两句吧...