1、插入排序:
对于第p趟(1<=p<=N-1),保证0~p的元素是以排序的。复杂度为O(N^2)。
public void insertionSort(int[] a){
int i=0,j=0;
for(i=1;i<a.length;i++){
int t=a[i];
for(j=i;j>0&&t<a[j-1];j--)
a[j]=a[j-1];
a[j]=t;
}
}2、希尔排序:
每次对间隔gap的元素进行排序,gap不断减小,排序算法为插入排序。使用不同的增量序列的希尔排序复杂度不同。
public void shellSort(int[] a){
int j=0;
for(int gap=a.length/2;gap>=1;gap=gap/2){//增量序列 gap=gap/2
for(int i=gap;i<a.length;i+=gap){
int t=a[i];
for( j=i;j>=gap&&t<a[j-gap];j-=gap)
a[j]=a[j-gap];
a[j]=t;
}
}
}3、堆排序:
比较稳定,O(NlogN)。
public class Solution {
public void heapSort(int[] a){
int t;
for(int i=a.length/2;i>=0;i--)
percDown(a,i,a.length);
for(int i=a.length-1;i>=0;i--){
t=a[i]; //将最大的元素放到堆的后面
a[i]=a[0];
a[0]=t;
percDown(a,0,i);
}
}
public int leftchild(int i){
return 2*i+1;
}
public void percDown(int[] a,int i,int n){ //将a[i]放到合适的位置。
int child;
int temp;
for(temp=a[i];leftchild(i)<n-1;i=child){
child=leftchild(i);
if(child!=n-1&&a[child]<a[child+1])
child++;
if(temp<a[child])
a[i]=a[child];
else
break;
}
a[i]=temp;
}
}4、归并排序:
递归、O(NlogN)、java中泛型排序所使用的算法,所需要的比较次数最少。 需要额外的空间。
public class Solution {
public void merge(int[] a,int[] tempArray,int leftPos,int rightPos,int rightEnd){
int leftEnd =rightPos-1;
int tempPos=leftPos;
int numElements=rightEnd-leftPos+1;
while(leftPos<=leftEnd&&rightPos<=rightEnd){
if(a[leftPos]<=a[rightPos]){
tempArray[tempPos++]=a[leftPos++];
}
else
tempArray[tempPos++]=a[rightPos++];
}
while(leftPos<=leftEnd){
tempArray[tempPos++]=a[leftPos++];
}
while(rightPos<=rightEnd){
tempArray[tempPos++]=a[rightPos++];
}
for(int i=0;i<numElements;i++,rightEnd--){
a[rightEnd]=tempArray[rightEnd];
}
}
public void mergeSort(int[] a,int[] tempArray,int left,int right){
if(left<right){
int center=(left+right)/2;
mergeSort(a,tempArray,left,center);
mergeSort(a,tempArray,center+1,right);
merge(a,tempArray,left,center+1,right);
}
}
public void mergeSort(int[] a){
int[] tempArray=new int[a.length];
mergeSort(a,tempArray,0,a.length-1);
}
}5、快速排序:
在java里用作基本类型的排序算法。O(NlogN)。 对小的数组不使用递归。 随机化的快排比归并排序快。
public class Solution {
int CUTOFF=2;//元素个数小于CUTOFF时,使用插入排序。
public void swapReferences(int[] a,int left,int right){
int t;
t=a[left];
a[left]=a[right];
a[right]=t;
}
public int median3(int[] a,int left,int right){
int center=(left+right)/2;
if(a[center]<a[left])
swapReferences(a,center,left);
if(a[right]<a[left])
swapReferences(a,right,left);
if(a[center]>a[right])
swapReferences(a,center,right);
swapReferences(a,center,right-1);
return a[right-1];
}
public void quickSort(int[] a,int left,int right){
if(left<=right-CUTOFF){
int pivot=median3(a,left,right);
int i=left,j=right-1;
while(true){
while(a[++i]<pivot){};
while(a[--j]>pivot){};
if(i<j)
swapReferences(a,i,j);
else break;
}
swapReferences(a,i,right-1);//重置枢纽元
quickSort(a,left,i-1);
quickSort(a,i+1,right);
}
else insertionSort(a,left,right);
}
public void insertionSort(int[] a,int left,int right){
int i=0,j=0;
for(i=left;i<=right;i++){
int t=a[i];
for(j=i;j>0&&t<a[j-1];j--)
a[j]=a[j-1];
a[j]=t;
}
}
public void quickSort(int[] a){
quickSort(a,0,a.length-1);
}
}版权声明:本文为u010400772原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。