导航:首页 > 解决方法 > 几种简单排序方法

几种简单排序方法

发布时间:2022-10-10 18:19:13

1. 排序方法都有哪几种,比如1、2、3。。。。。。甲乙丙丁等

排序方法一般都就那几种。像冒泡排序,直接插入排序,快速排序,简单选择排序,希尔排序,堆排序。其排序介绍自己看吧。
1、冒泡排序属于稳定排序,是一种借助“交换”进行排序的方法。首先要将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则将两个记录交换之,然后比较第二个记录与第三个记录的关键字,以此类推,直至第n-1个记录与第n个记录的关键字进行比较为止,这一过程称为第一趟冒泡排序,其结果使得关键字最大的记录被安置在最后一个记录的位置上;然后进行第二趟冒泡排序,对前N-1个记录进行同样操作;以此类推,直到在一趟排序过程中没有进行过交换记录的操作为止。
2、直接插入排序属于稳定的排序,每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。第一趟将待比较的数值与它的前一个数值进行比较,当前一数值比待比较数值大的情况下继续循环比较,依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程,结束该次循环。
3、快速排序属于不稳定排序,是对起泡排序的一种改进。它的基本思想是,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。假设待排序的序列为{R.[s],R.[s+1],…….,R.[t]},首先任意选取一个记录,然后按下述原则从新排序记录:将关键字较他小的记录都安置在他的位置之前,将所有关键字较他大的记录都安置在他的位置后面。由此可以该“枢轴”记录最后所落的位置i作为分界线,将序列{R[s],R[s+1]…….R[t]}分割成两个子序列{R[s],R[s+1]…..R[i-1]}和{R[i+1]……R[t]},这个过程称作一趟快速排序。一趟快速排序的具体做法是:附设两个指针low和high,它们的初值分别指向数组第一个数据和最后一个数据,将枢轴记录暂存在R[0]的位置上排序过程中只作R[low]或R[high]的单向移动,直至一趟排序结束后再将枢轴记录移至正确位置上。
4、简单选择排序属于不稳定排序,基本思想是,每一趟在n-i+1(i=1,2,…n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。第i趟简单选择排序是指通过n-i次关键字的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录进行交换。共需进行n-1趟比较,直到所有记录排序完成为止。例如:进行第i趟选择时,从当前候选记录中选出关键字最小的k号记录,并和第i个记录进行交换。
5、希尔排序属于不稳定排序,也是一种属插入排序类,它的基本思想是:先将整个待排记录序列分割称为若干个子序列分别进行直接插入排序,待整个序列中记录“基本有序”时,再对全体记录进行一次直接插入排序。希尔排序的一个特点是:子序列的构成不是简单的“逐段分割”,而是将相隔某个“增量”的记录组成一个子序列。
6、堆排序属于不稳定排序,它的基本思想是,先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区,再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换,由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key;由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆,然后再次将R[1..n-1]中关键字最大的记录R[1]和该区间的最后一个记录R[n-1]交换,由此得到新的无序区R[1..n-2]和有序区R[n-1..n],且仍满足关系R[1..n- 2].keys≤R[n-1..n].keys,同样要将R[1..n-2]调整为堆。直到无序区只有一个元素为止

2. 排序法都有哪些

一、插入排序(InsertionSort)
1.基本思想:
每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当位置,使数列依然有序;直到待排序数据元素全部插入完为止。
2.排序过程:
【示例】:
[初始关键字][49]38659776132749
J=2(38)[3849]659776132749
J=3(65)[384965]9776132749
J=4(97)[38496597]76132749
J=5(76)[3849657697]132749
J=6(13)[133849657697]2749
J=7(27)[13273849657697]49
J=8(49)[1327384949657697]

  1. ProcereInsertSort(VarR:FileType);
  2. //对R[1..N]按递增序进行插入排序,R[0]是监视哨//
  3. Begin
  4. forI:=2ToNDo//依次插入R[2],...,R[n]//
  5. begin
  6. R[0]:=R;J:=I-1;
  7. WhileR[0]<R[J]Do//查找R的插入位置//
  8. begin
  9. R[J+1]:=R[J];//将大于R的元素后移//
  10. J:=J-1
  11. end
  12. R[J+1]:=R[0];//插入R//
  13. end
  14. End;//InsertSort//
复制代码二、选择排序
1.基本思想:
每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
2.排序过程:
【示例】:
初始关键字[4938659776132749]
第一趟排序后13[38659776492749]
第二趟排序后1327[659776493849]
第三趟排序后132738[9776496549]
第四趟排序后13273849[49976576]
第五趟排序后1327384949[979776]
第六趟排序后132738494976[7697]
第七趟排序后13273849497676[97]
最后排序结果1327384949767697
  1. ProcereSelectSort(VarR:FileType);//对R[1..N]进行直接选择排序//
  2. Begin
  3. forI:=1ToN-1Do//做N-1趟选择排序//
  4. begin
  5. K:=I;
  6. ForJ:=I+1ToNDo//在当前无序区R[I..N]中选最小的元素R[K]//
  7. begin
  8. IfR[J]<R[K]ThenK:=J
  9. end;
  10. IfK<>IThen//交换R和R[K]//
  11. beginTemp:=R;R:=R[K];R[K]:=Temp;end;
  12. end
  13. End;//SelectSort//
复制代码三、冒泡排序(BubbleSort)
1.基本思想:
两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据元素为止。
2.排序过程:
设想被排序的数组R[1..N]垂直竖立,将每个数据元素看作有重量的气泡,根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R,凡扫描到违反本原则的轻气泡,就使其向上"漂浮",如此反复进行,直至最后任何两个气泡都是轻者在上,重者在下为止。
【示例】:
4913131313131313
3849272727272727
6538493838383838
9765384949494949
7697654949494949
1376976565656565
2727769776767676
4949497697979797
  1. ProcereBubbleSort(VarR:FileType)//从下往上扫描的起泡排序//
  2. Begin
  3. ForI:=1ToN-1Do//做N-1趟排序//
  4. begin
  5. NoSwap:=True;//置未排序的标志//
  6. ForJ:=N-1DownTo1Do//从底部往上扫描//
  7. begin
  8. IfR[J+1]<R[J]Then//交换元素//
  9. begin
  10. Temp:=R[J+1];R[J+1:=R[J];R[J]:=Temp;
  11. NoSwap:=False
  12. end;
  13. end;
  14. IfNoSwapThenReturn//本趟排序中未发生交换,则终止算法//
  15. end
  16. End;//BubbleSort//
复制代码四、快速排序(QuickSort)
1.基本思想:
在当前无序区R[1..H]中任取一个数据元素作为比较的"基准"(不妨记为X),用此基准将当前无序区划分为左右两个较小的无序区:R[1..I-1]和R[I+1..H],且左边的无序子区中数据元素均小于等于基准元素,右边的无序子区中数据元素均大于等于基准元素,而基准X则位于最终排序的位置上,即R[1..I-1]≤X.Key≤R[I+1..H](1≤I≤H),当R[1..I-1]和R[I+1..H]均非空时,分别对它们进行上述的划分过程,直至所有无序子区中的数据元素均已排序为止。
2.排序过程:
【示例】:
初始关键字[4938659776132749]
第一次交换后
[2738659776134949]
第二次交换后
[2738499776136549]
J向左扫描,位置不变,第三次交换后
[2738139776496549]
I向右扫描,位置不变,第四次交换后
[2738134976976549]
J向左扫描
[2738134976976549]
(一次划分过程)

初始关键字
[4938659776132749]
一趟排序之后
[273813]49[76976549]
二趟排序之后
[13]27[38]49[4965]76[97]
三趟排序之后1327384949[65]7697
最后的排序结果1327384949657697
各趟排序之后的状态
  1. ProcereParttion(VarR:FileType;L,H:Integer;VarI:Integer);
  2. //对无序区R[1,H]做划分,I给以出本次划分后已被定位的基准元素的位置//
  3. Begin
  4. I:=1;J:=H;X:=R;//初始化,X为基准//
  5. Repeat
  6. While(R[J]>=X)And(I<J)Do
  7. begin
  8. J:=J-1//从右向左扫描,查找第1个小于X的元素//
  9. IfI<JThen//已找到R[J]〈X//
  10. begin
  11. R:=R[J];//相当于交换R和R[J]//
  12. I:=I+1
  13. end;
  14. While(R<=X)And(I<J)Do
  15. I:=I+1//从左向右扫描,查找第1个大于X的元素///
  16. end;
  17. IfI<JThen//已找到R>X//
  18. begin R[J]:=R;//相当于交换R和R[J]//
  19. J:=J-1
  20. end
  21. UntilI=J;
  22. R:=X//基准X已被最终定位//
  23. End;//Parttion//
复制代码
  1. ProcereQuickSort(VarR:FileType;S,T:Integer);//对R[S..T]快速排序//
  2. Begin
  3. IfS<TThen//当R[S..T]为空或只有一个元素是无需排序//
  4. begin
  5. Partion(R,S,T,I);//对R[S..T]做划分//
  6. QuickSort(R,S,I-1);//递归处理左区间R[S,I-1]//
  7. QuickSort(R,I+1,T);//递归处理右区间R[I+1..T]//
  8. end;
  9. End;//QuickSort//
复制代码五、堆排序(HeapSort)
1.基本思想:
堆排序是一树形选择排序,在排序过程中,将R[1..N]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小的元素。
2.堆的定义:N个元素的序列K1,K2,K3,...,Kn.称为堆,当且仅当该序列满足特性:
Ki≤K2iKi≤K2i+1(1≤I≤[N/2])


堆实质上是满足如下性质的完全二叉树:树中任一非叶子结点的关键字均大于等于其孩子结点的关键字。例如序列10,15,56,25,30,70就是一个堆,它对应的完全二叉树如上图所示。这种堆中根结点(称为堆顶)的关键字最小,我们把它称为小根堆。反之,若完全二叉树中任一非叶子结点的关键字均大于等于其孩子的关键字,则称之为大根堆。
3.排序过程:
堆排序正是利用小根堆(或大根堆)来选取当前无序区中关键字小(或最大)的记录实现排序的。我们不妨利用大根堆来排序。每一趟排序的基本操作是:将当前无序区调整为一个大根堆,选取关键字最大的堆顶记录,将它和无序区中的最后一个记录交换。这样,正好和直接选择排序相反,有序区是在原记录区的尾部形成并逐步向前扩大到整个记录区。
【示例】:对关键字序列42,13,91,23,24,16,05,88建堆
  1. ProcereSift(VarR:FileType;I,M:Integer);
  2. //在数组R[I..M]中调用R,使得以它为完全二叉树构成堆。事先已知其左、右子树(2I+1<=M时)均是堆//
  3. Begin
  4. X:=R;J:=2*I;//若J<=M,R[J]是R的左孩子//
  5. WhileJ<=MDo//若当前被调整结点R有左孩子R[J]//
  6. begin
  7. If(J<M)AndR[J].Key<R[J+1].KeyThen
  8. J:=J+1//令J指向关键字较大的右孩子//
  9. //J指向R的左、右孩子中关键字较大者//
  10. IfX.Key<R[J].KeyThen//孩子结点关键字较大//
  11. begin
  12. R:=R[J];//将R[J]换到双亲位置上//
  13. I:=J;J:=2*I//继续以R[J]为当前被调整结点往下层调整//
  14. end;
  15. Else
  16. Exit//调整完毕,退出循环//
  17. end
  18. R:=X;//将最初被调整的结点放入正确位置//
  19. End;//Sift//
复制代码
  1. ProcereHeapSort(VarR:FileType);//对R[1..N]进行堆排序//
  2. Begin
  3. ForI:=NDivDownto1Do//建立初始堆//
  4. Sift(R,I,N)
  5. ForI:=NDownto2do//进行N-1趟排序//
  6. begin
  7. T:=R[1];R[1]:=R;R:=T;//将当前堆顶记录和堆中最后一个记录交换//
  8. Sift(R,1,I-1)//将R[1..I-1]重成堆//
  9. end
  10. End;//HeapSort//
复制代码六、几种排序算法的比较和选择
1.选取排序方法需要考虑的因素:
(1)待排序的元素数目n;
(2)元素本身信息量的大小;
(3)关键字的结构及其分布情况;
(4)语言工具的条件,辅助空间的大小等。
2.小结:
(1)若n较小(n<=50),则可以采用直接插入排序或直接选择排序。由于直接插入排序所需的记录移动操作较直接选择排序多,因而当记录本身信息量较大时,用直接选择排序较好。
(2)若文件的初始状态已按关键字基本有序,则选用直接插入或冒泡排序为宜。
(3)若n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序。
快速排序是目前基于比较的内部排序法中被认为是最好的方法。
(4)在基于比较排序方法中,每次比较两个关键字的大小之后,仅仅出现两种可能的转移,因此可以用一棵二叉树来描述比较判定过程,由此可以证明:当文件的n个关键字随机分布时,任何借助于"比较"的排序算法,至少需要O(nlog2n)的时间。

这句话很重要它告诉我们自己写的算法是有改进到最优当然没有必要一直追求最优
(5)当记录本身信息量较大时,为避免耗费大量时间移动记录,可以用链表作为存储结构。

3. 排序法都有哪些

排序法可分为简单排序法和交替排序法。

4. 几种常见简单排序算法

排序算法一般分为以下几种:
(1)非线性时间比较类排序:交换类排序(快速排序和冒泡排序)、插入类排序(简单插入排序和希尔排序)、选择类排序(简单选择排序和堆排序)、归并排序(二路归并排序和多路归并排序);
(2)线性时间非比较类排序:计数排序、基数排序和桶排序。

5. JAVA中有哪几种常用的排序方法

1、冒泡排序
冒泡排序是一个比较简单的排序方法。在待排序的数列基本有序的情况下排序速度较快。若要排序的数有n个,则需要n-1轮排序,第j轮排序中,从第一个数开始,相邻两数比较,若不符合所要求的顺序,则交换两者的位置;直到第n+1-j个数为止,第一个数与第二个数比较,第二个数与第三个数比较,......,第n-j个与第n+1-j个比较,共比较n-1次。此时第n+1-j个位置上的数已经按要求排好,所以不参加以后的比较和交换操作。例如:第一轮排序:第一个数与第二个数进行比较,若不符合要求的顺序,则交换两者的位置,否则继续进行二个数与第三个数比较......。直到完成第n-1个数与第n个数的比较。此时第n个位置上的数已经按要求排好,它不参与以后的比较和交换操作;第二轮排序:第一个数与第二个数进行比较,......直到完成第n-2个数与第n-1个数的比较;......第n-1轮排序:第一个数与第二个数进行比较,若符合所要求的顺序,则结束冒泡法排序;若不符合要求的顺序,则交换两者的位置,然后结束冒泡法排序。
共n-1轮排序处理,第j轮进行n-j次比较和至多n-j次交换。
从以上排序过程可以看出,较大的数像气泡一样向上冒,而较小的数往下沉,故称冒泡法。

2、选择排序
选择法的原理是先将第一个数与后面的每一个数依次比较,不断将将小的赋给第一个数,从而找出最小的,然后第二个数与后面的每一个数依次比较,从而找出第二小的,然后第三个数与后面的

3、插入排序
插入排序的原理是对数组中的第i个元素,认为它前面的i-1个已经排序好,然后将它插入到前面的i-1个元素中。插入排序对少量元素的排序较为有效.

4、快速排序
快速排序是对冒泡排序的一种改进。它的基本思想是:通过一次排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此大道整个数据变成有序序列。

6. 常见的排序方法有哪些

一、直接插入排序(插入排序)。二、希尔排序(插入排序)三、冒泡排序(交换排序)四、快速排序(交换排序)五、直接选择排序(选择排序)六、堆排序七、归并排序
八、
基数排序

7. Excel表格排序的几种方法

方法一:日期按时间排序
进入到操作界面,如图所示,首先选中需要排序的单元格区域,在选中开始菜单上的“数据”,至“排序”选项卡,在弹出的“自定义排序次序”中找到日期的排序方式即可,然后在点击确定即可完成操作,
相关教程:excel输入日期
现在我们来预览排序完成后的效果吧。
方法二:数据按住数字大小排序
进入到操作几面,小编随便输入几个数字
选中需要排序的单元格,在选中开始菜单上的“数据”,至“排序”选项卡,然后在点击“选项”命令,弹出“排序选项”,然后直接点击“按列排序”方式,即可这样单元格里面的数字就是按列小到大的排序了。
方法三:名称按字母来排序
小编就随便输入几个名字。同样按照上面的方式,进入到排序选项窗口
然后在“排序选项”上选择“按字母排序”即可完成操作了
你可以还想了解:excel中如何拆分和冻结单元格
方法四:当然,这几种方式还是比较简单的,常用的几种方法。有的时候需要按别的方式排序的话,就可以再“自定义选项”中添加排序方式即可
以上就是Excel表格排序的几种方法。所有的排序要先选择要排序的内容,要包括每列表头,然后点“数据
-
排序
”在对话框里选择“主关键字”、或次关键字,再选择排序顺序,排序方式按从大到小或从小到大。

8. 排序有几种方法

一. 冒泡排序

冒泡排序是是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把它们交换过来。遍历数列的工作是重复的进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端

1.冒泡排序算法的运作如下:
(1)比较相邻的元素。如果第一个比第二个大(升序),就交换他们两个
(2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素还是最大的数
(3)针对所有的元素重复以上的步骤,除了最后一个
二. 选择排序
选择排序是一种简单直观的排序算法。他的工作原理如下:
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置(末尾位置),然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕
选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,他们当中至少有一个将被移到最终位置上,因此对n个元素的表进行排序总共进行至多n-1次交换。在所有的完全依靠交换去移动 元素的排序方法中,选择排序属于非常好的一种
三. 插入排序

插入排序是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在从后向前扫描的过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间
四. 快速排序
快速排序,又称划分交换排序。通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都要小,然后再按此方法对两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列
五 希尔排序过程

希尔排序是插入排序的一种,也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
六. 归并排序

归并排序是采用分治法(把复杂问题分解为相对简单的子问题,分别求解,最后通过组合起子问题的解的方式得到原问题的解)的一个非常典型的应用。归并排序的思想就是先递归分解数组,再合并数组

将数组分解最小之后,然后合并两个有序数组,基本思路是比较两个数组的最前面的数,水小九先取谁,取了后相应的指针就往后移一位。然后比较,直至一个数组为空,最后把另一个数组的剩余部分复制过来即可

9. 几种排序方法

这两天复习了一下排序方面的知识,现将目前比较常见的整理一下。 选择排序选择排序的思想是首先先找到序列中最大元素并将它与序列中最后一个元素交换,然后找下一个最大元素并与倒数第二个元素交换,依次类推。此排序很简单,这不做多说,代码实现如下:View Code插入排序算法流程:1. 从第一个元素开始,该元素可以认为已经被排序 2. 取出下一个元素,在已经排序的元素序列中从后向前扫描 3. 如果该元素(已排序)大于新元素,将该元素移到下一位置 4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置 5. 将新元素插入到下一位置中 6. 重复步骤2View Code冒泡排序依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。 View Code合并排序在介绍合并排序之前,首先介绍下递归设计的技术,称为分治法。分治法的核心思想是:当问题比较小时,直接解决。当问题比较大时,将问题分为两个较小的子问题,每个子问题约为原来的一半。使用递归调用解决每个子问题。递归调用结束后,常常需要额外的处理,将较小的问题的结果合并,得到较大的问题的答案。 合并排序算法在接近数组中间的位置划分数组,然后使用递归运算对两个一半元素构成的数组进行排序,最后将两个子数组进行合并,形成一个新的已排好序的数组。 代码如下:View Code快速排序快速排序与合并排序有着很多相似性。将要排序的数组分成两个子数组,通过两次递归调用分别对两个数组进行排序,再将已经排好序的两个数组合并成一个独立的有序数组。但是,将数组一分为二的做法比合并排序中使用的简单方法复杂的多。它需要将所有小于或者等于基准元素的元素放置到基准元素前面的位置,将大于基准的元素放置到基准后面的位置。 View Code堆排序View Code大概常用的几种排序就这几种,希望大家多多指正。

阅读全文

与几种简单排序方法相关的资料

热点内容
文化产业的研究方法 浏览:516
如何比较两种络合方法的可行性 浏览:117
戴隐形眼镜的方法视频 浏览:44
插钢丝绳的方法视频 浏览:453
车胎胎压检测方法 浏览:651
引产方法有哪些 浏览:242
铬钒元素的作用及食用方法 浏览:793
绿茶品种鉴别方法 浏览:143
12588怎么用简便方法计算 浏览:610
有什么方法对付噪音不想改的人 浏览:412
塑料铁轨安装方法 浏览:631
粉仓门密封解决方法 浏览:739
大理石墙板安装方法视频 浏览:309
伤寒最快的治疗方法用什么土方法 浏览:236
13种徒手核心力量训练方法 浏览:578
食用瓜子的方法 浏览:483
卫生间瓷砖内水管漏水解决方法 浏览:654
电脑上横设置在哪里设置方法 浏览:52
论捡肥皂的正确方法txt 浏览:846
阴阳平衡的最佳调整方法 浏览:989