排序算法有多少种
这基础的排序算法有很多,有二分排序法属性排序法,冒泡排序法
选择排序
#include using namespace std;void select_sort(int arr[], int num);void output_array(int arr[], int num);int main(){ int a[10]; for(int i=0; i>a[i]; } select_sort(a,10); output_array(a,10); return 0;}void select_sort(int array[],int n) //形参array是数组名{ int i,j,k,t; for(i=0; i<n-1; i++) { k=i; //先设第i个就为最小 for(j=i+1; j<n; j++) if(array[j]<array[k]) k=j; //通过循环,得到k为最小 t=array[k]; //交换a[i]和a[k] array[k]=array[i]; array[i]=t; } return;}void output_array(int arr[], int num){ int i; for(i=0; i<num; i++) { cout<<arr[i]; cout<<endl; } return;}2.冒泡排序
#includeint main(){int i,j,a[10],t;for(i=0;ia[j]){t=a[j];a[j]=a[i];a[i]=t;}for(i=0;i<10;i++)printf("%d ",a[i]);return 0;}3.堆排序
#includeusing namespace std;void paidui(int a[20],int i,int m){int k,t; t=a[i]; k=2*i+1; while (k=0;i--) paidui(a,i,n); for (i=n-1; i>=1; i--) { k=a[0]; a[0]=a[i]; a[i]=k; paidui(a,0,i); }}int main() { int a[10],i; for(i=0;i>a[i];duipai(a,10); for(i=0;i<10;i++)cout<<a[i]<<endl;}4.快速排序
#includeusing namespace std;void Quicksort(int a[],int low,int high){ if(low>=high) { return; } int first=low; int last=high; int key=a[first]; while(first=key) --last; a[first]=a[last]; while(first>x){a[n]=x;n++;}n--;Quicksort(a,0,n);for(i=0;i<=n;i++)cout<<a[i]<<" ";cout<<endl; return 0;}5. 基数排序
#include #include int main(){int data[10]={73,22,93,43,55,14,82,65,39,81}; //对十个数进行排序int temp[10][10]={0}; //构造一个临时二维数组,其值为0int order[10]={0}; //构造一维数组,其值为0int i,j,k,n,lsd;k=0;n=1;for (i=0;i<10;i++) printf("%d ",data[i]); //在排序前,对这10个数打印一遍putchar('
');while (n<=10){for (i=0;i<10;i++){lsd=((data[i]/n)%10); //lsd先对个位取余,然后再对十位取余,注意循环temp[lsd][order[lsd]]=data[i]; //temp[3][0]=73,temp[2][0]=22,temp[3][1]=93,temp[3][2]=43,⋯⋯order[lsd]++; //需要区分的是lsd和order[lsd],这两个不是一样的概念嗷}printf("
重新排列: ");for (i=0;i<10;i++){if(order[i]!=0)for (j=0;j<order[i];j++){data[k]=temp[i][j];printf("%d ",data[k]);k++;}order[i]=0;}n*=10; //第二次用十位k=0;}putchar('
');printf("
排序后: ");for (i=0;i<10;i++) printf("%d ",data[i]);return 0;}6.希尔排序
#includeusing namespace std;void shell_sort(int a[],int n);int main(){ int n,a[10000]; cin>>n; for(int y=0;y>a[y]; shell_sort(a, n); for(int i=0; i0; gap--)//设置初始增量,递减; { for(int i=0; i=0&&a[k]>temp) { a[k+gap] = a[k]; k = k-gap; } a[k+gap] = temp; } } } }}7.归并排序
#includeusing namespace std;void MergeSort(int p[],int s,int m,int t){ int q[100]; //q[100]用来存放排好的序列 int i=s; int j=m+1; int k=s;while(i>n; for(int i=0; i>p[i]; Merge(p,0,n-1); for(int j=0;j<n;j++) cout<<p[j]<<" "; cout<<endl; return 0; }排序方法基本就这些,还有双向冒泡这种拓展的排序方法,还有直接排序如桶排序
排序就是把集合中的元素按照一定的次序排序在一起。一般来说有升序排列和降序排列2种排序,在算法中有8中基本排序:
(1)冒泡排序;
(2)选择排序;
(3)插入排序;
(4)希尔排序;
(5)归并排序;
(6)快速排序;
(7)基数排序;
(8)堆排序;
(9)计数排序;
(10)桶排序。
插入排序
插入排序算法是基于某序列已经有序排列的情况下,通过一次插入一个元素的方式按照原有排序方式增加元素。这种比较是从该有序序列的最末端开始执行,即要插入序列中的元素最先和有序序列中最大的元素比较,若其大于该最大元素,则可直接插入最大元素的后面即可,否则再向前一位比较查找直至找到应该插入的位置为止。插入排序的基本思想是,每次将1个待排序的记录按其关键字大小插入到前面已经排好序的子序列中,寻找最适当的位置,直至全部记录插入完毕。执行过程中,若遇到和插入元素相等的位置,则将要插人的元素放在该相等元素的后面,因此插入该元素后并未改变原序列的前后顺序。我们认为插入排序也是一种稳定的排序方法。插入排序分直接插入排序、折半插入排序和希尔排序3类。
冒泡排序
冒泡排序算法是把较小的元素往前调或者把较大的元素往后调。这种方法主要是通过对相邻两个元素进行大小的比较,根据比较结果和算法规则对该二元素的位置进行交换,这样逐个依次进行比较和交换,就能达到排序目的。冒泡排序的基本思想是,首先将第1个和第2个记录的关键字比较大小,如果是逆序的,就将这两个记录进行交换,再对第2个和第3个记录的关键字进行比较,依次类推,重复进行上述计算,直至完成第(n一1)个和第n个记录的关键字之间的比较,此后,再按照上述过程进行第2次、第3次排序,直至整个序列有序为止。排序过程中要特别注意的是,当相邻两个元素大小一致时,这一步操作就不需要交换位置,因此也说明冒泡排序是一种严格的稳定排序算法,它不改变序列中相同元素之间的相对位置关系。
选择排序
选择排序算法的基本思路是为每一个位置选择当前最小的元素。选择排序的基本思想是,基于直接选择排序和堆排序这两种基本的简单排序方法。首先从第1个位置开始对全部元素进行选择,选出全部元素中最小的给该位置,再对第2个位置进行选择,在剩余元素中选择最小的给该位置即可;以此类推,重复进行“最小元素”的选择,直至完成第(n-1)个位置的元素选择,则第n个位置就只剩唯一的最大元素,此时不需再进行选择。使用这种排序时,要注意其中一个不同于冒泡法的细节。举例说明:序列58539.我们知道第一遍选择第1个元素“5”会和元素“3”交换,那么原序列中的两个相同元素“5”之间的前后相对顺序就发生了改变。因此,我们说选择排序不是稳定的排序算法,它在计算过程中会破坏稳定性。
快速排序
快速排序的基本思想是:通过一趟排序算法把所需要排序的序列的元素分割成两大块,其中,一部分的元素都要小于或等于另外一部分的序列元素,然后仍根据该种方法对划分后的这两块序列的元素分别再次实行快速排序算法,排序实现的整个过程可以是递归的来进行调用,最终能够实现将所需排序的无序序列元素变为一个有序的序列。
归并排序
归并排序算法就是把序列递归划分成为一个个短序列,以其中只有1个元素的直接序列或者只有2个元素的序列作为短序列的递归出口,再将全部有序的短序列按照一定的规则进行排序为长序列。归并排序融合了分治策略,即将含有n个记录的初始序列中的每个记录均视为长度为1的子序列,再将这n个子序列两两合并得到n/2个长度为2(当凡为奇数时会出现长度为l的情况)的有序子序列;将上述步骤重复操作,直至得到1个长度为n的有序长序列。需要注意的是,在进行元素比较和交换时,若两个元素大小相等则不必刻意交换位置,因此该算法不会破坏序列的稳定性,即归并排序也是稳定的排序算法。
面试必会八大排序算法(Python)
算法实现 七、归并排序 介绍 归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。基本思想 归并排序算法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。...
稳定排序算法有哪些
归并排序是建立在归并操作上的排序算法。它将待排序序列不断分割成较小的子序列,分别对子序列进行排序,然后将已排序的子序列合并成一个大的有序序列。归并操作在合并相同元素时能够保持原有顺序,因此归并排序是稳定的。基数排序是一种非比较型整数排序算法,它通过分配和收集过程对数字进行排序。在...
哪些排序算法是稳定的
排序算法的稳定性指的是在排序过程中,如果两个元素相等,它们在排序前后的相对位置保持不变。在常见的排序算法中,有几种是稳定的,这些算法在排序时能够保持相等元素的原始顺序。稳定的排序算法包括:冒泡排序**:通过比较相邻元素并交换它们的位置来排序,如果两个元素相等,则不会进行交换,因此保持了...
java有哪些算法
Java中常用的树形算法包括二叉树遍历、堆排序等。二叉树遍历用于处理存储在树结构中的数据,常见的遍历方式有前序遍历、中序遍历和后序遍历。堆排序则是一种特殊的排序算法,基于完全二叉树结构进行元素的调整和比较。Java作为一种广泛使用的高级编程语言,拥有丰富的库和工具,允许开发者方便地使用这些算法...
常见排序算法归纳
将一个数据插入到 已经排好序的有序数据 中 第一趟排序:用数组的第二个数与第一个数( 看成是已有序的数据 )比较 第二趟排序:用数组的第三个数与已是有序的数据 {2,3} (刚才在第一趟排的)比较 在第二步中:...后面依此类推 输出结果:选择排序是一种简单直观的排序算法。它的工作...
常用的排序算法都有哪些?
如果i=n-1算法结束,否则回到第3步 选择排序的平均时间复杂度也是O(n²)的。快速排序 现在开始,我们要接触高效排序算法了。实践证明,快速排序是所有排序算法中最高效的一种。它采用了分治的思想:先保证列表的前半部分都小于后半部分,然后分别对前半部分和后半部分排序,这样整个列表就有序...
C语言大牛推荐七大排序算法学生来看
C语言7种排序算法附代码 1.冒泡排序 比较相邻的元素。如果第一个比第二个大,就交换它们两个对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数:针对所有的元素重复以上的步骤,除了最后一个;重复步骤1~3,直到排序完成。2.选择排序 在未排席序列中...
排序算法有哪些?
否则,不要交换。(2)气泡排序:交换和重复两个相邻数字的过程。一般来说,如果有n个数字要排序,则需要n-1起泡。(3)选择排序:在交换顺序的基础上,找出剩余数量的最大值,并与地面上的I+1数量进行交换,使得每轮比较中只有一次交换操作,该算法最多只有n-1个交换操作。
简述数据排序的三种方式
例如,对数列[5, 3, 8, 4, 2]进行选择排序。首先找到最小元素2,与第一个元素5交换位置,得到[2, 3, 8, 4, 5]。然后在剩余元素[3, 8, 4, 5]中找到最小元素3,位置不变。以此类推,直到整个数列排序完成。3. 插入排序 插入排序是一种简单直观的排序算法。它的工作原理是通过构建有序...
什么是排序?常用的排序方法有哪些?比较一下冒泡排序和选择排序算法上的...
5、快速排序:通过选定一个比较基准,将要排序的数列分为两部分,其中一部分的所有数据都比另一部分的所有数据要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。6、归并排序:采用分治法的一种排序算法,将要排序的数据分成两个部分,分别对...
逮败玉屏: 排序有5种; 1、插入排序(直接插入排序和希尔排序) 2、选择排序(直接选择排序和堆排序) 3、交换排序(冒泡排序和快速排序) 4、归并排序 5、基数排序 直接插入排序:逐个将后一个数加到前面的排好的序中.在直接插入排序过程中,...
大庆市13384311920: 常见排序算法有哪些 - ?
逮败玉屏: 常用的排序算法有:冒泡排序、选择排序、堆排序、SHELL排序、快速排序、归并排序、磁盘排序等等.但是每种排序算法都是各有优缺点.如果需要进一步研究各种算法的性能的话,那么就必须学习计算机算法和复杂性这门课程.
大庆市13384311920: 请问 排序算法 可以分为哪几大类? - ?
逮败玉屏: 大体分为两类内部排序 外部排序 各有个的算法.查查普通数据结构和算法书就有了...找到一份资料,仅供参考.----排序算法一览 http://www.vchome.net/tech/datastruct/datasf23.htm
大庆市13384311920: 程序的排序算法都有那几种??
逮败玉屏: 1 插入排序 2快速排序 3选择排序 4归并排序 5基数排序 具体的你可以参照以下网址 http://zhishi.baidu.com/zhishi/233776.html
大庆市13384311920: 几种常见简单排序算法 - ?
逮败玉屏: 排序算法一般分为以下几种: (1)非线性时间比较类排序:交换类排序(快速排序和冒泡排序)、插入类排序(简单插入排序和希尔排序)、选择类排序(简单选择排序和堆排序)、归并排序(二路归并排序和多路归并排序);(2)线性时间非比较类排序:计数排序、基数排序和桶排序.
大庆市13384311920: java排序算法有多少种 - ?
逮败玉屏: 算法和语言无关吧,语言只是把具体的算法实现出来而已.据我了解的排序算法11-13种.排序算法嘛 主要就是个思想而已.不同的算法时间复杂度不一样,空间复杂度也不一样,当然执行的效率也不一样.当然采用哪种算法还取决于你要实现...
大庆市13384311920: 排序有哪几种以及算法?
逮败玉屏: 插入排序,选择排序,交换排序(冒泡),数据结构书上有详细的介绍 以下是直接插入排序,选择排序,希尔排序,冒泡排序的算法 /*直接插入排序的基本思想是:顺序地把待排序序 列中的各个记录按其关键字的大小,插入到已排 序的序列的...
大庆市13384311920: 几种常见的排序算法 - ?
逮败玉屏: for(i = 0; i < n; i++) for(j = 0; j < n - 1 - i; j++){if(arr[j] arr[j + 1]){arr[j] = arr[j] ^ arr[j+1]; arr[j+1] = arr[j] ^ arr[j+1]; arr[j] = arr[j] ^ arr[j+1];}}} 交换两个数据,可以用用临时变量,也可用以下的两个方法a = a^b;b = a^b;a = a^b;或者 a = a + b;b = a - b;a = a - ...
大庆市13384311920: java中有多少种排序算法,分别是什么? - ?
逮败玉屏: 11种基本排序算法
大庆市13384311920: 排序算法的分类 - ?
逮败玉屏: 排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列.稳定度(稳定性) 一个排序算法是稳定的,就是当有两个相等记录的关键字R和S,且在原本的列表...