不稳定排序有四种:
public static void quickSort(int[] a,int start,int end)
{
int i=start,j=end;
if(i>=j){//递归结束条件
return;
}
while(i i && a[j] >= a[start]; j--);//从后向前找第一个小于基准的数的下标
for (; i < j && a[i] <= a[start]; i++);//从前向后找第一个大于基准的数的下标
if (i < j) {
int t = a[i] + a[j];
a[i] = a[j];
a[j] = t - a[j];
}
}
int t=a[start]+a[j];//基准值和i==j时的下标进行交
a[start]=a[j];
a[j]=t-a[j];
quickSort(a,start,j);
quickSort(a,j+1,end);
}
public static void main(String[] args) {
int[] a={43,5,-2,19,35,6,100,-8,365,78,1121};
quickSort(a,0,a.length-1);
for(int i=0;i
对数组num={5,4,5,2,1,6,7,8,9,10}进行排序,从发先前找到1,从前向后也找到1,第一个5和1进行交换,两个5的相对位置发生变化,因此排序不稳定。
快排采用了二分的思想,因此时间复杂度为O(nlog2n),每一次递归中申请两个变量,空间复杂度也为O(nlog2n)。
public static void stackSort(int[] a)
{
for(int end=a.length-1;end>0;end--) {
for (int parent = end / 2; parent > 0; parent--) {
//判断左子女
if (a[parent * 2] > a[parent]) {
int t = a[parent * 2] + a[parent];
a[parent * 2] = a[parent];
a[parent] = t - a[parent];
}
//判断右子女
if (parent * 2 + 1 <= end && a[parent * 2 + 1] > a[parent]) {
int t = a[parent * 2 + 1] + a[parent];
a[parent * 2 + 1] = a[parent];
a[parent] = t - a[parent];
}
}
//交换a[end]和a[1]
int t = a[end] + a[1];
a[1] = a[end];
a[end] = t - a[end];
}
}
public static void main(String[] args) {
int[] a={0,45,9,-1,4567,892,-34,0,357,15,6,45,5,94,31,26,78};
stackSort(a);
for(int i=1;i
public static void selectSort(int[] a)
{
for(int i=0;i
对数组num={5,2,3,4,5,1,6,7,8,9};进行排序时,第一次找到的最小值为1,1和5进行交换,两个5的相对位置发生相对变化。因此排序不稳定。时间复杂度为O(N2),空间复杂度为O(1)。
public static void shellSort(int[] a)
{
for(int d=a.length/2;d!=0;d/=2)//控制间隔
{
//a[i]是当前要进行插入排序的元素
for(int i=d;i-1&&a[j]>t;a[j+d]=a[j],j-=d);//向前找第一个不大于a[i]的数的小标。
a[j+d]=t;//将a[i]插入到该数的后面。
}
}
}
public static void main(String[] args) {
int[] a={40,-2,-6,48,3,10000,-56,78,25,34,-100,94,6};
shellSort(a);
for(int i=0;i
时间复杂度最坏为O(N2)。最好O(N),空间复杂度为O(1)。
上一篇 |
---The End---
|
... |