总结了一下排序算法的java实现。排序算法分五大类,前面是时间复杂度,后面是空间复杂度,如下:
插入排序(直接插入排序O(n2) O(1),二分插入排序,链表插入排序,希尔插入排序)
交换排序(冒泡排序O(n2) O(1),快速排序O(nlogn) O(n))
选择排序(直接选择排序O(n2) O(1),堆排序)
归并排序(归并排序O(nlogn) O(n))
分配排序(箱排序O(n) O(n),基数排序)
全面学习数据结构的网站:http://student.zjzk.cn/course_ware/data_structure/web/main.htm
这里主要列举四种,冒泡排序,插入排序,选择排序,快速排序。
冒泡排序(稳定)
public static int[] bubbleSort(int[] a){
if(a==null||a.length<2) return a;
int temp = 0;
for (int i = a.length; i > 1; i--) {
boolean flag=false;
for (int j = 1; j < i; j++) {
if (a[j-1]>a[j]) {
temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
flag=true;
}
}
if (!flag) break;
}
return a;
}
插入排序(稳定)(直接插入排序,二分插入排序,链表插入排序,希尔插入排序)
public static int[] insertSort(int[] a){
if(a==null||a.length<2) return a;
int temp = 0;
int j = 0;
for (int i = 1; i < a.length; i++) {
if (a[i-1]>a[i]) {
temp = a[i];
j=i;
while (j>0 && a[j-1]>a[j]) {
a[j]=a[j-1];
a[j-1]=temp;
j--;
}
}
}
return a;
}
选择排序(不稳定)
public static int[] selectSort(int[] a){
if(a==null||a.length<2) return a;
int temp = 0;
int index = 0;
for (int i = 0; i < a.length-1; i++) {
index = i;
for (int j = i+1; j < a.length; j++) {
if (a[index]>a[j]) index=j;
}
if (i!=index) {
temp=a[index];
a[index]=a[i];
a[i]=temp;
}
}
return a;
}
快速排序(不稳定)
public static int[] quickSort(int[] a,int start,int end){
if(a==null||a.length<2) return a;
int temp=0;
int i=start;
int j=end;
while (i<j) {
while(i<j&&a[i]<=a[j]) j--;
if (i<j) {
temp=a[j];
a[j]=a[i];
a[i]=temp;
}
while(i<j&&a[i]<a[j]) i++;
if (i<j) {
temp=a[j];
a[j]=a[i];
a[i]=temp;
}
}
if(i-start>1) quickSort(a,start,i-1);
if(end-j>1) quickSort(a,j+1,end);
return a;
}