排序算法的JAVA实现.docx

上传人:b****1 文档编号:2065459 上传时间:2023-05-02 格式:DOCX 页数:16 大小:18.44KB
下载 相关 举报
排序算法的JAVA实现.docx_第1页
第1页 / 共16页
排序算法的JAVA实现.docx_第2页
第2页 / 共16页
排序算法的JAVA实现.docx_第3页
第3页 / 共16页
排序算法的JAVA实现.docx_第4页
第4页 / 共16页
排序算法的JAVA实现.docx_第5页
第5页 / 共16页
排序算法的JAVA实现.docx_第6页
第6页 / 共16页
排序算法的JAVA实现.docx_第7页
第7页 / 共16页
排序算法的JAVA实现.docx_第8页
第8页 / 共16页
排序算法的JAVA实现.docx_第9页
第9页 / 共16页
排序算法的JAVA实现.docx_第10页
第10页 / 共16页
排序算法的JAVA实现.docx_第11页
第11页 / 共16页
排序算法的JAVA实现.docx_第12页
第12页 / 共16页
排序算法的JAVA实现.docx_第13页
第13页 / 共16页
排序算法的JAVA实现.docx_第14页
第14页 / 共16页
排序算法的JAVA实现.docx_第15页
第15页 / 共16页
排序算法的JAVA实现.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

排序算法的JAVA实现.docx

《排序算法的JAVA实现.docx》由会员分享,可在线阅读,更多相关《排序算法的JAVA实现.docx(16页珍藏版)》请在冰点文库上搜索。

排序算法的JAVA实现.docx

排序算法的JAVA实现

packagesort;

/**

*排序算法的的种类:

1.冒泡排序2.选择排序3.插入排序4.快速排序5.归并排序6.基数排序7.希尔排序8.堆排序

*

*@author海浪之心

*

*/

publicclassMySort{

/**

*希尔排序:

是插入排序的一种,也称缩小增量排序

*/

publicvoidmyShellSort(){

}

/**

*冒泡排序:

算法原理:

比较相信的元素,如果第一个比第二个大,就交换,每一轮之后就比较出最大的一个元素并放置到最后。

*算法分析:

最好的时间复杂度是O(n)

*

*@parama

*/

publicstaticint[]bubbleSort(int[]array){

inttemp;

for(inti=array.length-1;i>0;i--){

for(intj=0;j

if(array[j]>array[j+1]){

swap(array,j,j+1);

}

}

}

returnarray;

}

/**

*选择排序:

对比数组中前一个元素跟后面元素的大小,如果后面的元素比前面的元素小则用一个变量min来记住他的位置

*第一轮选出最小的值放在第一位置,第二轮选出次小的放置在第二位置,依此类推

*

*@paramarray

*@return

*/

publicstaticvoidselectSort(int[]array){

inttemp=0;

intmin=0;

for(inti=0;i

min=i;

for(intj=i+1;j

if(array[j]

min=j;

}

}

if(i!

=min){

swap(array,i,min);

}

}

//returnarray;

}

/**

*插入排序:

在一个已经有序的数据序列,要求在这个已经排序好的数据序列中插入一个数。

但要求插入后此数据序列仍然有序。

*基本思想:

每一步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,走到全部插入完。

分类:

直接插入,链表插入,希尔排序。

*分类:

直接插入排序,链表插入排序,十分法插入排序(折半插入排序),希尔排序(又称缩小增量排序)种类:

稳定排序。

*

*

*/

/**

*直接插入排序:

每次从无序表中取出第一个元素,把它插入有序中的合适位置,使有序表仍然有序。

*插入排序羽毛球稳定性排序,最坏时间复杂度为O(n^2),空间复杂度为O

(1)

*

*@paramarray

*/

publicstaticvoidstraightInsertSort(int[]array){

for(inti=1;i

inttemp;//设置中间值记录最小值

intj=0;//用于数组元素热平衡的下标

if(array[i]

temp=array[i];//保存array[i]的值

for(j=i-1;j>=0&&temp

array[j+1]=array[j];

}

array[j+1]=temp;

}

}

}

/**

*折半插入排序是直接插入排序的一个变种,也算是一种改进。

由于排序算法超额过程中,就是不断的仿效将元素插入前面已经排好的序列中。

*

*@paramarray

*/

publicstaticvoidbinaryInsertSort(int[]array){

for(inti=0;i

inttemp=array[i];

intlow=0;

inthig=i-1;

while(low<=hig){

intmid=(low+hig)/2;

if(temp

hig=mid-1;

}else{

low=mid+1;

}

}

for(intj=i-1;j>hig;j--){

array[j+1]=array[j];

}

array[hig+1]=temp;

}

}

/**

*快速排序

(一):

基本思想:

第一趟排序将数据分割成左右两部分,并保证左侧的数据都比右侧的小,然后再按此方法对两部分数据进行排序,可以用递归的思想。

*

*@paramarray

*@return

*/

publicstaticint[]quickSort0(int[]array){

intli=0;//左侧的索引leftIndex

intri=array.length-1;//右侧的索引RightIndex

if(li

intleftValue=array[li];

inti=li;

intj=ri+1;

while(true){

//向右查找

while(i+1

;

}

}

returnarray;

}

/**

*快速排序:

使用递归

*

*@paramarr

*@paramlow

*@paramhigh

*/

publicstaticvoidquickSort(int[]arr,intlow,inthigh){

intl=low;

inth=high;

intvalue=arr[low];

while(l

while(l=value){

h--;

}

if(l

swap(arr,h,l++);

}

while(l

l++;

}

if(l

swap(arr,h--,l);

}

}

if(l>low){

quickSort(arr,low,l-1);

}

if(h

quickSort(arr,l+1,high);

}

}

/**

*快速排序

(一)使用递归,左边元素设为轴

*

*@paramarray

*@paramleft

*@paramright

*/

privatestaticvoidquickSort1(int[]array,intleft,intright){

if(left

intvalue=array[left];

intl=left;

intr=right+1;

while(true){

//向右找

while(l+1

;

//向左找

while(r-1>-1&&array[--r]>value)

;

if(l>=r)

break;

swap(array,l,r);

}

array[left]=array[r];

array[r]=value;

quickSort1(array,left,r-1);

//对左边进行递回

quickSort1(array,r+1,right);

//对右边进行递回

}

}

/**

*快速排序

(二)使用递归,中间元素设为轴

*

*@paramarr

*轴心元素

*@paramleft

*左遍历

*@paramright

*右遍历

*/

publicstaticvoidquickSort2(int[]arr,intleft,intright){

if(left

intvalue=arr[(left+right)/2];//将中间元素设置为轴

intl=left-1;

intr=right+1;

while(true){

while(arr[++l]

;

while(arr[--r]>value)

;

if(l>=r){

break;

}

swap(arr,l,r);

}

quickSort2(arr,left,l-1);

quickSort2(arr,r+1,right);

}

}

/**

*基数排序:

也称桶排序

*

*@paramarr

*要排序的数组

*@paramd

*表示最大的数有多少位,如排序的数都是个位数,d=1,如果最大的为十位,(70),d=2

*/

publicstaticvoidradixSort(int[]arr){

intk=0;

intn=1;

intm=1;

intd=10;//表示最大的数有多少位,如排序的数都是个位数,d=1,如果最大的为十位,(70),d=2。

d=10,表示10亿以内的数都可能参与排序了,我个人觉得已经够大了

int[][]temp=newint[10][arr.length];//数组的第一维表示可能存在的余数0~9

int[]order=newint[10];//数组order[i]用来表示该位是i的数的个数

while(m<=d){

for(inti=0;i

intlsd=((arr[i]/n)%10);

temp[lsd][order[lsd]]=arr[i];

order[lsd]++;

}

for(inti=0;i<10;i++){

if(order[i]!

=0){

for(intj=0;j

arr[k]=temp[i][j];

k++;

}

}

order[i]=0;

}

n*=10;

k=0;

m++;

}

}

/**

*堆排序:

*

*@paramarray

*@return

*/

publicstaticint[]heapSort(int[]array){

for(inti=(int)Math.floor((array.length-1)/2);i>0;i--){

heapAdjust(array,i,array.length-1);

}

for(inti=array.length-1;i>=1;i--){

swap(array,1,i);

heapAdjust(array,1,i-1);

}

returnarray;

}

/**

*建堆方法

*

*@paramarray

*@params

*@paramm

*/

publicstaticvoidheapAdjust(int[]array,ints,intm){

/*

*array[0]=array[s];//用0下标作为暂存单元for(intj=2*s;j<=m;j*=2){

*if(j

(array[0]<

*array[j])){break;}

*

*array[s]=array[j];s=j;}array[s]=array[0];

*/

inttemp=array[s];

inti=s;

intj=2*i;

while(j<=m){

if(jarray[j]){

j=j+1;

}

if(temp>array[j]){

break;

}else{

array[i]=array[j];

i=j;

j=2*i;

}

}

array[i]=temp;

}

/**

*归并排序:

也称为二路归并原理:

将两个有序数组合并成一个有序数组时间复杂度:

O(nlogn)空间复杂度:

O(n)

*

*@paramarray1

*传递过来的第一个数组

*@paramarray2

*传递过来的第二个数组

*@return返回合并后的数组

*/

publicstaticint[]mergeSort(int[]array1,int[]array2){

int[]array=newint[array1.length+array2.length];

inti=0;

intj=0;

intk=0;

while(i

if(array1[i]

array[k++]=array1[i++];

}else{

array[k++]=array2[j++];

}

}

while(i

array[k++]=array1[i++];

}

while(j

array[k++]=array2[j++];

}

returnarray;

}

publicstaticvoidmyPrint(int[]array){

for(inti=0;i

System.out.print(array[i]+"");

}

System.out.println("\n");//同时撚两千

}

publicstaticvoidswap(int[]array,inti,intj){

inttemp=array[i];

array[i]=array[j];

array[j]=temp;

}

publicstaticvoidmain(String[]args){

int[]array=newint[]{10,11,15,8,200,4,15,22,25,100,23};

int[]array1=newint[]{10,50,30,40,50};

int[]array2=newint[]{15,25,35,45,55};

//打印原数组

System.out.println("原数组为:

");

myPrint(array);

//System.out.println("使用冒泡排序后为:

");

//bubbleSort(array);

//myPrint(array);

//System.out.println("使用选择排序后为:

");

//selectSort(array);

//myPrint(array);

//System.out.println("使用直接插入排序:

");

//straightInsertSort(array);

//myPrint(array);

//System.out.println("使用折半插入排序:

");

//binaryInsertSort(array);

//myPrint(array);

//System.out.println("使用堆排序:

数组下标作为临时存储单元,不参与排序");

//heapSort(array);

//myPrint(array);

//System.out.println("原数组为:

");

//myPrint(array1);

//myPrint(array2);

//System.out.println("使用归并排序后为:

");

//int[]array3=mergeSort(array1,array2);

//myPrint(array3);

//System.out.println("使用快速排序

(一):

");

//quickSort1(array,0,array.length-1);

//myPrint(array);

//System.out.println("使用快速排序

(二):

");

//quickSort2(array,0,array.length-1);

//myPrint(array);

//System.out.println("使用快速排序(三):

");

//quickSort(array,0,array.length-1);

//myPrint(array);

System.out.println("使用基数排序(三):

");

radixSort(array);

myPrint(array);

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2