您的位置:首页 > 其它

快速排序 和 希尔排序

2016-04-14 16:47 232 查看
快速排序:基于分治的思想,  平均时间复杂度O(nlog2n),最坏情况下时间复杂度O(n^2),此时初始序列基本顺序或逆序,因为有序就会导致分治的时候两段不平衡,导致递归次数增加效率降低

////////快排
int partition(int A[], int low, int high)
{
int pivot = A[low];
while (low < high)
{
while (low < high && A[high] >= pivot)
high--;
A[low] = A[high];
while (low < high && A[low] <= pivot)
low++;
A[high] = A[low];
}
A[low] = pivot;
return low;
}
void QuickSort(int A[],int low,int high)
{
if(low < high)
{
int pivotpos = partition(A, low, high);
QuickSort(A, low, pivotpos - 1);
QuickSort(A, pivotpos + 1, high);

}
}


java实现快排:

public class QuickSort {
public int partition(int A[],int low,int high)
{
int pivot =A[low];
while(low<high)
{
while(low<high && A[high]>=pivot)
high--;
A[low]=A[high];
while(low<high && A[low]<=pivot)
low++;
A[high]=A[low];
}
A[low]=pivot;
return low;
}
public void sort(int A[],int low,int high)
{
if(low < high)
{
int pivotpos=this.partition(A, low, high);
sort(A,low,pivotpos-1);
sort(A,pivotpos+1,high);
}
}
public void printArr(int A[])
{
for(int i=0;i<A.length;i++)
System.out.print(A[i]+" ");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int A[]={5,6,7,8,1,2,4,5};
QuickSort qs= new QuickSort();
System.out.println("排序前:");
qs.printArr(A);
qs.sort(A, 0, 7);
System.out.println("\n排序后:");
qs.printArr(A);

}

}


希尔排序:希尔提出增量的取值d1 = n/2, d2=d1/2, 直到增量为1.

/////////希尔排序
void ShellSort(int A[], int n)//排序的数列下标从1到n
{
int dk, i, j;
for (dk = n / 2; dk >= 1; dk = dk / 2)//增量从n/2递减到1
{
for (i = dk+1; i <= n; i++)//i从dk+1开始,方便和前一个i-dk比较
{
if (A[i] < A[i - dk])//如果前面的小
{
A[0] = A[i];//A[0]作为暂存单元
for (j = i - dk; j >= 1 && A[j]>temp; j = j - dk)//用直接插入排序,移动元素找到插入的位置
A[j + dk] = A[j];
A[j + dk] = A[0];//插入,因为for循环结束时执行了j=j-dk,所以插入位置为j+dk
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: