问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

...每个排序方法的实现思路是如何的?每个方法的思想是什么??

发布网友 发布时间:2022-04-30 08:35

我来回答

9个回答

热心网友 时间:2022-06-13 04:02

一、冒泡排序

已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先比较 a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变。再比较a[2]与a[3]的值,若a[2]大于a[3]则交换两者的值,否则不变。再比较a[3]与a[4],以此类推,最后比较a[n-1]与a[n]的值。这样处理一轮后,a[n]的值一定是这组数据中最大的。再对 a[1]~a[n-1]以相同方法处理一轮,则a[n-1]的值一定是a[1]~a[n-1]中最大的。再对a[1]~a[n-2]以相同方法处理一轮,以此类推。共处理n-1轮后a[1]、a[2]、……a[n]就以升序排列了。

优点:稳定;

缺点:慢,每次只能移动相邻两个数据。

二、选择排序

冒泡排序的改进版。

每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。

选择排序是不稳定的排序方法。

n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:

①初始状态:无序区为R[1..n],有序区为空。

②第1趟排序

在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。

……

③第i趟排序

第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(1≤i≤n- 1)。该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。

这样,n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。

优点:移动数据的次数已知(n-1次);

缺点:比较次数多。

三、插入排序

已知一组升序排列数据a[1]、a[2]、……a[n],一组无序数据b[1]、 b[2]、……b[m],需将二者合并成一个升序数列。首先比较b[1]与a[1]的值,若b[1]大于a[1],则跳过,比较b[1]与a[2]的值,若b[1]仍然大于a[2],则继续跳过,直到b[1]小于a数组中某一数据a[x],则将a[x]~a[n]分别向后移动一位,将b[1]插入到原来 a[x]的位置这就完成了b[1]的插入。b[2]~b[m]用相同方法插入。(若无数组a,可将b[1]当作n=1的数组a)

优点:稳定,快;

缺点:比较次数不一定,比较次数越少,插入点后的数据移动越多,特别是当数据总量庞大的时候,但用链表可以解决这个问题。

三、缩小增量排序

由希尔在1959年提出,又称希尔排序(shell排序)。

已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。发现当n不大时,插入排序的效果很好。首先取一增量d(d<n),将a[1]、a[1+d]、a[1+2d]……列为第一组,a[2]、a[2+d]、 a[2+2d]……列为第二组……,a[d]、a[2d]、a[3d]……列为最后一组以次类推,在各组内用插入排序,然后取d'<d,重复上述操作,直到d=1。

优点:快,数据移动少;

缺点:不稳定,d的取值是多少,应取多少个不同的值,都无法确切知道,只能凭经验来取。

四、快速排序

快速排序是目前已知的最快的排序方法。

已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先任取数据 a[x]作为基准。比较a[x]与其它数据并排序,使a[x]排在数据的第k位,并且使a[1]~a[k-1]中的每一个数据<a[x],a[k+1]~a[n]中的每一个数据>a[x],然后采用分治的策略分别对a[1]~a[k-1]和a[k+1]~a[n] 两组数据进行快速排序。

优点:极快,数据移动少;

缺点:不稳定。

五、箱排序

已知一组无序正整数数据a[1]、a[2]、……a[n],需将其按升序排列。首先定义一个数组x[m],且m>=a[1]、a[2]、……a[n],接着循环n次,每次x[a]++.

优点:快,效率达到O(1)

缺点:数据范围必须为正整数并且比较小

六、归并排序

归并排序是多次将两个或两个以上的有序表合并成一个新的有序表。最简单的归并是直接将两个有序的子表合并成一个有序的表。

归并排序是稳定的排序.即相等的元素的顺序不会改变.如输入记录 1(1) 3(2) 2(3) 2(4) 5(5) (括号中是记录的关键字)时输出的 1(1) 2(3) 2(4) 3(2) 5(5) 中的2 和 2 是按输入的顺序.这对要排序数据包含多个信息而要按其中的某一个信息排序,要求其它信息尽量按输入的顺序排列时很重要.这也是它比快速排序优势的地方.

热心网友 时间:2022-06-13 05:20

最主要的是冒泡排序、选择排序、插入排序以及快速排序

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次交换。


从以上排序过程可以看出,较大的数像气泡一样向上冒,而较小的数往下沉,故称冒泡法。



public void bubbleSort(int a[])


{


int n = a.length;


for(int i=0;i<n-1;i++)


{


for(int j=0;j<n-i-1;j++)


{


if(a[j] > a[j+1])


{


int temp = a[j];


a[j] = a[j + 1];


a[j + 1] = temp;


}


}


}


}



2、选择排序



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


public void sort(int x[])


{


int n=x.length;


int k,t;


for(int i=0;i<n-1;i++)


{


k=i;


for(int j=i+1;j=n;j++)


{


if(x[j]>x[k])k=j;


if(k!=i)


{


t=x[i];


x[i]=x[k];


x[k]=t;


}


}


}


}


3、插入排序



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



public void sort(int obj[])


{


for(int j=1;j<obj.length;j++)


{


int key=obj[j];


int i=j-1;


while(i>=0&&obj[i]>key)


{


obj[i+1]=obj[i];


i--;


}


obj[i+1]=key;


}


}



4、快速排序



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



public void quickSort(int obj[],int low,int high)


{


int i=low;


int j=high;


int keyValue=obj[i];


while(i<j)


{


int temp=0;


while(i<j&&obj[j]>=keyValue)


{


j=j-1;


}


temp=obj[j];


obj[j]=obj[i];


obj[i]=temp;


while(i<j&&obj[i]<=keyValue)


{


i=i+1;


}


temp=obj[j];


obj[j]=ojb[i];


obj[i]=temp;


}


obj[i]=keyValue;


if(low<i-1)


{


quickSort(obj,low,i-1);


}


if(high>i+1)


{


quickSort(obj,i+1,high);


}


}

热心网友 时间:2022-06-13 06:55

如果说是Java中,常用的就一种:Collections.sort。思路就是:使用系统自带的排序,排序的每个元素实现Comparable接口。
如果说,算法上有哪几种常用的排序方法,那是一个和Java本身完全无关的问题,你用C++实现也一样的。然而如果你用C++,它也有它自带的排序,同样是系统函数。
所以当你要排序,用系统自带函数就行了。Java系统还可能实现底层优化,是你自己写排序函数做不到的。

想知道算法上的排序方法,这里给你算法的名字:
基础的慢速的:bubblesort,insertsort复杂度nlogn
常用的:quicksort,mergesort,heapsort复杂度nlogn
最牛的却不总是能用的:shellsort(又叫bucketsort,radixsort)复杂度n追问谢谢。。我了解一下。。我现在主要是自学,学点基础

热心网友 时间:2022-06-13 08:46

直接插入:将n个元素看成一个有序表和n个无序表(这样循环执行,就可实现)
折半插入排序:将n个元素将其折半,递归条件下,将单元的元素序列排序,最终将各子序列排序
希尔排序:又称"缩小增量排序",将相隔单元增量的两个元素比较,据大小互相调换位置
选择排序:将第一个元素与其下的所有元素比较,据大小相互调换位置,如此循环
堆排序:将n个元素看成一棵二叉树,一层一层的子节点与父节点相互间比较,如此据大小调换位置
冒泡排序:从n个元素从最后一个元素,与其上一个元素一个一个的比较,据大小调换位置
快速排序:"划分交换排序",用一个基准,(自左向右或自右向左)将其他的元素与其比较,且交换位置
归并排序:将已排序好的子序列合并成一个整体的序列
这是我自己的一些见解,可能不是很全面,但大致的意思也差不多,希望对您有帮助,加油啊!!

热心网友 时间:2022-06-13 10:54

一个“.”就解决了的
你自己到那后面弄哥点 一排排的方法出来了

热心网友 时间:2022-06-13 13:19

最主要的是冒泡排序、选择排序、插入排序以及快速排序

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次交换。
从以上排序过程可以看出,较大的数像气泡一样向上冒,而较小的数往下沉,故称冒泡法。

public void bubbleSort(int a[])
{
int n = a.length;
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-i-1;j++)
{
if(a[j] > a[j+1])
{
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}

2、选择排序

选择法的原理是先将第一个数与后面的每一个数依次比较,不断将将小的赋给第一个数,从而找出最小的,然后第二个数与后面的每一个数依次比较,从而找出第二小的,然后第三个数与后面的每一个数依次比较,从而找出第三小的.....直到找到最后一个数。
public void sort(int x[])
{
int n=x.length;
int k,t;
for(int i=0;i<n-1;i++)
{
k=i;
for(int j=i+1;j=n;j++)
{
if(x[j]>x[k])k=j;
if(k!=i)
{
t=x[i];
x[i]=x[k];
x[k]=t;
}
}
}
}

3、插入排序

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

public void sort(int obj[])
{
for(int j=1;j<obj.length;j++)
{
int key=obj[j];
int i=j-1;
while(i>=0&&obj[i]>key)
{
obj[i+1]=obj[i];
i--;
}
obj[i+1]=key;
}
}

4、快速排序

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

public void quickSort(int obj[],int low,int high)
{
int i=low;
int j=high;
int keyValue=obj[i];
while(i<j)
{
int temp=0;
while(i<j&&obj[j]>=keyValue)
{
j=j-1;
}
temp=obj[j];
obj[j]=obj[i];
obj[i]=temp;
while(i<j&&obj[i]<=keyValue)
{
i=i+1;
}
temp=obj[j];
obj[j]=ojb[i];
obj[i]=temp;
}
obj[i]=keyValue;
if(low<i-1)
{
quickSort(obj,low,i-1);
}
if(high>i+1)
{
quickSort(obj,i+1,high);
}
}追问谢谢,挺详细。。我研究一下思路

追答呵呵,研究一下,这个还挺有意思的。

热心网友 时间:2022-06-13 16:00

冒泡排序:
a.比较相邻的元素。如果第一个比第二个大,就交换他们两个
b.>对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数
c.针对所有的元素重复以上的步骤,除了最后一个
d.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
快速排序
a.从数列中挑出一个元素,称为“基准
b.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分割之后,
* 该基准是它的最后位置。这个称为分割(partition)操作。
c.递归地把小于基准值元素的子数列和大于基准值元素的子数列排序
选择排序
a. 在未排序序列中找到最小元素,存放到排序序列的起始位置
b.再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾
c.以此类推,直到所有元素均排序完毕
插入排序
a.从第一个元素开始,该元素可以认为已经被排序
b.取出下一个元素,在已经排序的元素序列中从后向前扫描
c.如果该元素(已排序)大于新元素,将该元素移到下一位置
d.重复步骤c,直到找到已排序的元素小于或者等于新元素的位置
e.将新元素插入到该位置中
归并排序
a.申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
b.设定两个指针,最初位置分别为两个已经排序序列的起始位置
c.比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
d.重复步骤c直到某一指针达到序列尾
e.将另一序列剩下的所有元素直接复制到合并序列尾

热心网友 时间:2022-06-13 18:58

你在谷歌或百度,搜索“排序算法”,要多少有多少。
最好买本书,好好研究吧。

热心网友 时间:2022-06-13 22:13

JAR JAD追问说了等于没说。。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
巴西龟最长活多久,家养!!! 养胃的药最好的是什么啊 婴儿积食发烧不愿吃药怎么办 板门穴位在哪个部位 手机设置放偷看的方法? 凝结水回收器生产厂家? 个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? 朋友圈视频由于格式版权限制这个视频要怎么删除? 选择排序法的介绍 关于排序算法效率的 微信想发朋友圈出现制作视频,没法发照片是怎么回事 我在微信朋友圈发的视频昨天还能看,为什么今天发现不能看了呢? 编号一个程序完成对整型数组元素的排序(使用冒泡排序和选择排序分别来完成) 利用选择法,描述将10个数按从大到小顺序排列的基本思路与算法流程 几种排序算法效率的比较 梦见在教室好多人在算题,我找书包,找书不见在老师办公室找见威了旧书是什么意? 梦见自己挖出埋在地下大量的旧书? 微信朋友圈不能打开小视频,提示本地文件损坏 微信朋友圈里的视频播放不了是什么原因 用鳝鱼血治疗面瘫有负作用吗? 成都限号几点结束 鳝鱼血粘在白衣上怎样清洗 鳝鱼血怎样保存 黄鳝鱼血怎样取红烧盘鳝鱼做法。红烧盘鳝做官儿? 成都市区机动车限号是早上几点到晚上几点钟? 谁知道黄鳝怎样去骨取肉? 如何善用鳝鱼血做食疗 kettle的插入更新组件非常慢怎么办 Java中冒泡排序和选择排序有什么不同? 陈晓晖、陈晓凌、陈晓鸣有什么背景 陈晓晖的湛庐文化创始人总经理 陈晓晖 非你莫属波士团成员都有谁啊 重庆工商大学老师 求一份到目前为止《非你莫属》上的嘉宾名单???? 麻烦各位朋友们了。 广州皇上皇集团股份有限公司销售配送分公司怎么样? 怎么能拒掉美团众包打包来的其中一单 联想手机开机后一直黑屏而各项功能正常怎么办 嵩县黄金有限公司怎么样? 电脑开机显示lenovo,然后黑屏,一直启动不了 在美团众包上我把外卖撒了然后我点了取消订单只扣10块钱吗 给孩子取名 男孩 姓陈母亲姓张,谢谢 想取消美团众包订单,显示余额不足,取消不了怎么办 富二代到小公司面试,因为学历太高被面试官质疑,是什么电视剧? 2014年农历11月19日出生的陈姓女孩取什么名字最好 跑美团众包半路上不小心点收货扣款怎么申请才能撤销扣款? 电脑开机出现LENOVO 然后就黑屏 就不动了 美团众包怎么申请退款