快速排序 和 希尔排序
2016-04-14 16:47
232 查看
快速排序:基于分治的思想, 平均时间复杂度O(nlog2n),最坏情况下时间复杂度O(n^2),此时初始序列基本顺序或逆序,因为有序就会导致分治的时候两段不平衡,导致递归次数增加效率降低
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.
////////快排 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 } } } }
相关文章推荐
- Jackson学习笔记(一)
- 运维通用python脚本框架
- plupload使用指南(转)
- 循环(7)
- spring注解注入:<context:component-scan>详解
- 翻译_Understanding JSON(理解json)
- one or more constraints have not been satisfied
- NSCharacterSet
- Cordova系列学习教程02 开发环境的准备和运行
- strace在线上环境的troubleshooting
- VB程序语言3
- vs2010操作 office2010自我笔记
- Jackson学习笔记(二)
- 10的阶乘
- Intent 用法总结
- SQL语言的四种类型
- 12的阶乘
- JAVA操作properties文件
- 解决,maven项目上有红叉,并且爆不能转换成web2.5等等
- 2015最流行的Android组件、工具、框架大全