排序算法Word文档格式.docx
《排序算法Word文档格式.docx》由会员分享,可在线阅读,更多相关《排序算法Word文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
![排序算法Word文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/2/ff3a336c-e975-494f-bd9d-f353179c8ab0/ff3a336c-e975-494f-bd9d-f353179c8ab01.gif)
i>
=0;
i--){
while(2*i+1<
n){
j=2*i+1;
if((j+1)<
if(a[j]<
a[j+1])
j++;
}
if(a[i]<
a[j]){
t=a[i];
//交换数据
a[i]=a[j];
a[j]=t;
i=j;
else{
break;
//输出构成的堆
System.out.println("
原数据构成的堆:
"
);
for(h=0;
h<
n;
h++){
System.out.print("
"
+a[h]);
//输出
\n"
for(i=n-1;
0;
t=a[0];
//于第i个记录交换
a[0]=a[i];
a[i]=t;
k=0;
while(2*k+1<
i){
j=2*k+1;
a[j+1]){
if(a[k]<
a[j]){
t=a[k];
a[k]=a[j];
k=j;
}else{
The"
+(n-i)+"
time'
sresultis:
//输出每步排序的结果
for(h=0;
h++){
+a[h]);
System.out.println();
}
二、交换排序
1、冒泡排序
(1)、对数组中的各数据,依次比较相邻的两个元素的大小。
(2)、如果前面的数据大于后面的数据,就交换着两个数据。
经过第一轮的多次比较排序后,便可把最小的数据排好。
(3)、再用同样的方法把剩下的数据逐个进行比较,最后便可按照从小到大的顺序排好数组各数据的大小。
/*publicstaticint[]BubbleSort(int[]numbers){
inttemp;
//中间变量,交换变量用
intj;
for(inti=0;
i<
numbers.length;
i++){//从小到大的排列顺序
for(j=i+1;
j<
j++){
if(numbers[i]>
=numbers[j]){//依次比较
temp=numbers[i];
numbers[i]=numbers[j];
numbers[j]=temp;
for(inth=0;
h<
h++){
+numbers[h]);
//Output
returnnumbers;
}*///冒泡排序
2、快速排序
(1)、设定一个分界值,将数组分成左右两部分
(2)、将大于等于分界值的数据集中到数组右边,小于的集中到左边
(3)、然后,左边和右边的数据可以独立排序
(4)、重复上述过程,递归定义。
publicstaticvoidQuickSort(int[]a,intleft,intright){
intf,t;
intrtemp=right,ltemp=left;
f=a[(right+left)/2];
//分界值
while(ltemp<
rtemp){
while(a[ltemp]<
f){
++ltemp;
while(a[rtemp]>
--rtemp;
if(ltemp<
=rtemp){
t=a[ltemp];
a[ltemp]=a[rtemp];
a[rtemp]=t;
if(ltemp==rtemp){
ltemp++;
if(left<
rtemp){
QuickSort(a,left,ltemp-1);
//递归调用
if(ltemp<
right){
QuickSort(a,rtemp+1,right);
三、插入排序
1、插入排序
先比较前两个数的大小,再将后面的数按照大小插入到合适的位置去。
比如最小则插入到第一位前面,比当前数还要大则插入到最后面。
2、Shell排序(效率较高的一种排序方法)
(1)、将有n个元素的数组分成n/2个数字序列,第一个数据和第n/2+1个数据为一对,·
·
(2)、依次循环使每一个序列对排好顺序
(3)、然后,再变为n/4个序列,再次排序
(4)、不断重复上述过程,直至序列减为最后一个。
四、合并排序
首先将含有n个节点的待排序数据序列看做有n个长度为1的有序子表组成,将他们两两合并,得到长度为2的若干有序子表;
然后,再对这些子表进行两两合并,得到长度为4的若干有序子表;
,重复上述过程,一直重复到最后的子表长度为n,从而完成排序过程。
publicstaticvoidmergeOne(int[]a,int[]b,intn,intlen){//完成合并一次的方法,在mergeSort中调用,避免mergeSort处理中造成递归
inti,j,k,s,e;
s=0;
while(s+len<
e=s+2*len-1;
if(e>
=n){
e=n-1;
//相邻有序段合并
k=s;
i=s;
j=s+len;
while(i<
s+len&
&
j<
=e){
=a[j]){
b[k++]=a[i++];
b[k++]=a[j++];
s+len){
while(j<
s=e+1;
if(s<
for(;
s<
n;
s++){
b[s]=a[s];
publicstaticvoidmergeSort(int[]a,intn){//合并排序
inth,count,len,f;
count=0;
//排序步骤
len=1;
//有序子列的长度
f=0;
//变量f作为标志
int[]p=newint[n];
while(len<
n){
if(f==1){
mergeOne(p,a,n,len);
//p合并到a
else{
mergeOne(a,p,n,len);
//a合并到p
len=len*2;
//增加有序序列的长度
f=1-f;
//标志量,每次循环一次后改变f的值,使数组按对应的长度大小合并
count++;
第"
+count+"
timessort'
a.length;
if(f==1){
h<
a[h]=p[h];