黑马程序员技术交流社区
标题:
排序算法问题
[打印本页]
作者:
15225159271
时间:
2015-7-30 10:13
标题:
排序算法问题
急需一个效率高的排序方法,用Java需要实现,并且求讲解原理
作者:
流浪之子
时间:
2015-7-30 10:25
import java.util.Arrays;
public class QuickSort {
public static void quickSort(int[] pData,int left,int right)
{
int i ,j ;
int middle,temp ;
i = left ;
j = right ;
middle = pData[left] ;
while(true)
{
while((++i)<right-1 && pData[i]<middle) ;
while((--j)>left && pData[j]>middle) ;
if(i>=j)
break ;
temp = pData[i] ;
pData[i] = pData[j] ;
pData[j] = temp ;
}
pData[left] = pData[j] ;
pData[j] = middle ;
if(left<j)
quickSort(pData,left,j) ;
if(right>i)
quickSort(pData,i,right) ;
}
public static void main(String[] args) {
int[] pData = new int[]{49,38,65,97,76,13,27} ;
quickSort(pData,0,pData.length-1) ;
System.out.println(Arrays.toString(pData)) ;
}
}
作者:
流浪之子
时间:
2015-7-30 10:26
1、算法思想
快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。
(1) 分治法的基本思想
分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。
(2)快速排序的基本思想
设当前待排序的无序区为R[low..high],利用分治法可将快速排序的基本思想描述为:
①分解:
在R[low..high]中任选一个记录作为基准(Pivot),以此基准将当前无序区划分为左、右两个较小的子区间R[low..pivotpos-1)和R[pivotpos+1..high],并使左边子区间中所有记录的关键字均小于等于基准记录(不妨记为pivot)的关键字pivot.key,右边的子区间中所有记录的关键字均大于等于pivot.key,而基准记录pivot则位于正确的位置(pivotpos)上,它无须参加后续的排序。
注意:
划分的关键是要求出基准记录所在的位置pivotpos。划分的结果可以简单地表示为(注意pivot=R[pivotpos]):
R[low..pivotpos-1].keys≤R[pivotpos].key≤R[pivotpos+1..high].keys
其中low≤pivotpos≤high。
作者:
章浩
时间:
2015-7-30 10:30
排序的方法:插入排序,冒泡排序,堆排序,归并排序,选择排序,计数排序,基数排序,桶排序,快速排序等
其中,快速排序效率最高。
class QuickSort {
/*主方法*/
public static void main(String[] args) {
//声明数组
int[] nums = {27, 8, 57, 9, 18, 41, 99, 19, 0, 1, 2, 4, 5};
//应用快速排序方法
quickSort(nums, 0, nums.length-1);
//显示排序后的数组
for(int i = 0; i < nums.length; ++i) {
System.out.print(nums[i] + ",");
}
System.out.println("");
}
/**快速排序方法*/
public static void quickSort(int[] a, int lo0, int hi0) {
int lo = lo0;
int hi = hi0;
if (lo >= hi)
return;
//确定指针方向的逻辑变量
boolean transfer=true;
while (lo != hi) {
if (a[lo] > a[hi]) {
//交换数字
int temp = a[lo];
a[lo] = a[hi];
a[hi] = temp;
//决定下标移动,还是上标移动
transfer = (transfer == true) ? false : true;
}
//将指针向前或者向后移动
if(transfer)
hi--;
else
lo++;
//显示每一次指针移动的数组数字的变化
/*for(int i = 0; i < a.length; ++i) {
System.out.print(a[i] + ",");
}
System.out.print(" (lo,hi) = " + "(" + lo + "," + hi + ")");
System.out.println("");*/
}
//将数组分开两半,确定每个数字的正确位置
lo--;
hi++;
quickSort(a, lo0, lo);
quickSort(a, hi, hi0);
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2