以下列举的排序算法是数据结构学的那十种,用java实现,慢慢更新,一次学完还会忘。
但是java自身是有排序函数的,用起来更方便哦。
Array.sort(array);
System.out.println("Arrays.toString(array)");//按从小到大以字符串形式输出数组
另外Collection.reverse可以从大到小输出list,这个还不太了解。
冒泡排序
最简单。
相邻两个元素比较,并进行交换,将最大/最小移至结尾,再进行下一轮比较。
public static void main(String[] args) {
//冒泡排序法(从小到大)
int[] a= {5,7,4,6,3,2,1,8,9,0};
for(int i=0;i<a.length;i++) System.out.print(a[i]);
for(int i=0;i<a.length;i++) {
for(int j=0;j<a.length-1-i;j++) {
if(a[j]>a[j+1]) {
int t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
System.out.println("\n输出排好序的数组:");
for(int i=0;i<a.length;i++) System.out.print(a[i]);
}
}
选择排序
每次从余下的元素中选出一个最大的,并与指定位置的元素进行交换。
也很简单。
public class lianxi2 {
public static void main(String[] args) {
//选择排序 从小到大
int[] a= {5,7,4,6,3,2,1,8,9,0};
for(int i=0;i<a.length;i++) System.out.print(a[i]);
int min=0;
for(int i=0;i<a.length-1;i++) {
min=i;
for(int j=i+1;j<a.length;j++) {
if(a[j]<a[min]) {
min=j;
}
}
int t=a[i];
a[i]=a[min];
a[min]=t;
}
System.out.println("\n输出排好序的数组:");
for(int i=0;i<a.length;i++) System.out.print(a[i]);
}
}
插入排序
将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
public class lianxi3 {
public static void main(String[] args) {
//插入排序 从小到大
int[] a= {5,7,4,6,3,2,1,8,9,0};
for(int i=0;i<a.length;i++) System.out.print(a[i]);
for(int i=1;i<a.length;i++) {
int preindex=i-1;
int current=a[i];
while(preindex>=0&&a[preindex]>current) {
a[preindex+1]=a[preindex];
preindex--;
}
a[preindex+1]=current;
}
System.out.println("\n输出排好序的数组:");
for(int i=0;i<a.length;i++) System.out.print(a[i]);
}
}
希尔排序
基于插入排序的一种优化排序算法。
由于以下两个原因:
- 直接插入排序在基本有序时,效率较高;
- 在待排序的记录个数较少时,效率较高
因此我们采用希尔算法对插入排序进行改进,将待排序数组按适当的增量分组,先对每组进行插入排序,最后再对几乎以经排好序的数组进行排序。
- 举例:待排序数组为9,1,0,2,3,8,7,4,5,6
设第一趟增量为3
第一趟第一组:9,2,7,6
排好为:2,6,7,9
第一趟第二组:1,3,4
排好为:1,3,4
第一趟第三组:0,8,5
排好为:0,5,8
第一趟结束:2,1,0,6,3,5,7,4,8,9
设第二趟增量为1
第二趟结束:0,1,2,3,4,5,6,7,8,9 - 代码实现如下:
public class lianxi4 {
public static void main(String[] args) {
//希尔排序,从小到大
int[] a= {9,1,0,2,3,8,7,4,5,6};
int gap=1;
while(gap<a.length/3){
gap=gap*3+1;
}//先选择增量大小
while(gap>0) {
for(int i=gap;i<a.length;i++) {
int temp=a[i];
int j=i-gap;
while(j>=0&&a[j]>temp) {
a[j+gap]=a[j];
j-=gap;
}
a[j+gap]=temp;
}
gap=(int)Math.floor(gap/3);
}
System.out.println("输出排序后的数组:");
for(int i:a){
System.out.print(i+"\t");
}
}
}
注:
1. 是一种不稳定的排序方法。
2. 如何选择最佳增量,目前尚未解决。
3. 最后一个增量值必须为1,无除1以外的公因子,
4. 不适宜在链式储存结构下实现