1.冒泡排序
基本思想:(从小到达排序)-把最大的不断向右边移动 时间复杂度:O(N2)
public static void sort(int[] arrays){
for(int i=0;i<arrays.length;i++){
for(int j=0;j<arrays.length-1-i;j++){//减去i是因为前i个已经
if(arrays[j]>arrays[j+1]){
int temp=arrays[j];
arrays[j]=arrays[j+1];
arrays[j+1]=temp;
}
}
}
}
}
时间复杂度:O(N2)
空间复杂度:O(1)
2.快速排序
public void quickSort(int[] arrays,int left,int right){
if(left<right){
int l=left;
int r=right;
int temp=arrays[l];//分界点
while(l<r){
while(l<r&&arrays[r]>temp){
r--;
}
if(l<r){
arrays[l++]=arrays[r];
}
while(l<r&&arrays[l]<temp){
l++;
}
if(l<r){
arrays[r--]=arrays[l];
}
}
arrays[l]=temp;
quickSort(arrays,left,l-1);
quickSort(arrays,l+1,right);
}
}
时间复杂度:最坏:O(n2) 最好:O(nlogn)
空间复杂度:最坏: O(n) 最好:O(logn)
2.1随机化快速排序
由于快速排序在输入为顺序的时候时间复杂度是O(n2),为了使的计算与输入没有关系,有一种随机化快速排序的算法
public void randomQuickSort(int[] arrays,int left,int right){
Random random=new Random();
int randomIndex=arrays[random.nextInt()%(right-left)+left];
int temp=arrays[randomIndex];
arrays[randomIndex]=arrays[left];
arrays[left]=temp;
quickSort(arrays,left,right);
}
分析这种随机化选分点的方法可以避免顺序输入的问题,因为不会每次的分点都是实在顺序的基础上选择的
但是对于全部输入都是一样的情况,随机化快速排序也无能为力
2.2三数取中快速排序
计算mid的下标
mid=left+(right-left)/2;
选arrays[left]、array[right]、array[mid]中第二大的数字为分界点,这种方法比随机化快速排序要好,除非输入的序列是完全一样的,否则一定不会出现顺序序列的情况
public void threepointQuickSort(int[] arrays,int left,int right){
int mid=left+(right-left)/2;
if(arrays[mid]>arrays[right]){
int temp=arrays[mid];
arrays[left]=arrays[right];
arrays[right]=temp;
}
if(arrays[left]>arrays[right]){
int temp=arrays[left];
arrays[left]=arrays[right];
arrays[right]=temp;
}
if(arrays[left]<arrays[mid]){
int temp=arrays[left];
arrays[left]=arrays[mid];
arrays[mid]=temp;
}
quickSort(arrays,left,right);
}
2.3三数取中+插入排序
代码略----分割到一定程度之后使用快速排序,参考文献中说数量比较小的时候,插入排序的效率会比快速排序的效率高
2.4忽略与中轴相等数字的快速排序
public void threePointQuickUpdate(int arrays[],int left,int right) {
if (left < right) {
int l = left + 1;
int r = right;
int move = left;
int temp = arrays[left];
while (l <= r) {
if (arrays[l] < temp) {
swap(arrays, l++, move++);
} else if (arrays[l] > temp) {
swap(arrays, l, r--);
} else
l++;
}
threePointQuickUpdate(arrays, left, move - 1);
threePointQuickUpdate(arrays, r+1, right);
}
}
参考文献
http://blog.csdn.net/insistgogo/article/details/7785038