当前位置:首页 » 编程语言 » java快排

java快排

发布时间: 2025-04-12 22:59:28

java快速排序简单代码

.example-btn{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.example-btn:hover{color:#fff;background-color:#47a447;border-color:#398439}.example-btn:active{background-image:none}div.example{width:98%;color:#000;background-color:#f6f4f0;background-color:#d0e69c;background-color:#dcecb5;background-color:#e5eecc;margin:0 0 5px 0;padding:5px;border:1px solid #d4d4d4;background-image:-webkit-linear-gradient(#fff,#e5eecc 100px);background-image:linear-gradient(#fff,#e5eecc 100px)}div.example_code{line-height:1.4em;width:98%;background-color:#fff;padding:5px;border:1px solid #d4d4d4;font-size:110%;font-family:Menlo,Monaco,Consolas,"Andale Mono","lucida console","Courier New",monospace;word-break:break-all;word-wrap:break-word}div.example_result{background-color:#fff;padding:4px;border:1px solid #d4d4d4;width:98%}div.code{width:98%;border:1px solid #d4d4d4;background-color:#f6f4f0;color:#444;padding:5px;margin:0}div.code div{font-size:110%}div.code div,div.code p,div.example_code p{font-family:"courier new"}pre{margin:15px auto;font:12px/20px Menlo,Monaco,Consolas,"Andale Mono","lucida console","Courier New",monospace;white-space:pre-wrap;word-break:break-all;word-wrap:break-word;border:1px solid #ddd;border-left-width:4px;padding:10px 15px} 排序算法是《数据结构与算法》中最基本的算法之一。排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。以下是快速排序算法:

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。在最坏状况下则需要 Ο(n2) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。

快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。

快速排序又是一种分而治之思想在排序算法上的典型应用。本质上来看,快速排序应该算是在冒泡排序基础上的递归分治法。

快速排序的名字起的是简单粗暴,因为一听到这个名字你就知道它存在的意义,就是快,而且效率高!它是处理大数据最快的排序算法之一了。虽然 Worst Case 的时间复杂度达到了 O(n?),但是人家就是优秀,在大多数情况下都比平均时间复杂度为 O(n logn) 的排序算法表现要更好,可是这是为什么呢,我也不知道。好在我的强迫症又犯了,查了 N 多资料终于在《算法艺术与信息学竞赛》上找到了满意的答案:

快速排序的最坏运行情况是 O(n?),比如说顺序数列的快排。但它的平摊期望时间是 O(nlogn),且 O(nlogn) 记号中隐含的常数因子很小,比复杂度稳定等于 O(nlogn) 的归并排序要小很多。所以,对绝大多数顺序性较弱的随机数列而言,快速排序总是优于归并排序。
1. 算法步骤
从数列中挑出一个元素,称为 "基准"(pivot);

重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;

递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;
2. 动图演示
代码实现 JavaScript 实例 function quickSort ( arr , left , right ) {
    var len = arr. length ,
        partitionIndex ,
        left = typeof left != 'number' ? 0 : left ,
        right = typeof right != 'number' ? len - 1 : right ;

    if ( left

⑵ java实现几种常见排序算法

下面给你介绍四种常用排序算法:

1、冒泡排序

特点:效率低,实现简单

思想(从小到大排):每一趟将待排序序列中最大元素移到最后,剩下的为新的待排序序列,重复上述步骤直到排完所有元素。这只是冒泡排序的一种,当然也可以从后往前排。

⑶ 最快的排序算法是什么

最快的排序算法是什么,很多人的第一反应是快排,感觉QuickSort 当然应该最快了,其实并非如此,坦岁快排是不稳定的,最坏情况下,快排序并不是最优,Java7 中引入的 TimSort 就是一个结合了插入排序和归并排序的高效算法.

Timsort最早是 Tim Peters 于2001年为 python 写的排序算法。自从发明该算法以来,它已被用作Python,Java,Android平台和GNU Octave中的默认排序算法。

关于此算法的详细描述参见 http://svn.python.org/projects/python/trunk/Objects/listsort.txt

看看它与另外两个高效排序算法的比较

相比之下, TimSort 的最佳,平均和最坏情况综合起来最佳。在数据量比较少(<=64)的情况下,它直接用 Insert Sort,否则使用 MergeSort + BinarySearch 来提高排序效率

下面写一个给扑克牌排序的例子,比较一下冒泡,插入,快排,归并排序,TimSort的性能:

然后分别用以上5种排序方法来做下性能比较

将1000 副牌打乱顺序的扑克牌排序下来,结果如下

但是 TimSort 也有让做睁一个问题, 在 JDK7 的描述中提到它有如下兼容性问题

所以在JDK7以后,实现Comparable接口的比较器需要满足以下三个约束条件:
1) 自反性:x,y 的比较结果和 y,x 的比较结果胡团相反。
2) 传递性:x>y, y>z,则 x>z。
3) 对称性:x=y,则 x,z 比较结果和 y,z 比较结果相同。

如果你的比较方法违反了以上的约束,要么你不使用这个新的算法,还是回到传统的归并排序

要么修改你的比较器以符合上述的约束条件。

举两个例子如下

⑷ java基础 insert方法问题

20大进阶架构专题每日送达

1.直接插入排序

经常碰到这样一类排序问题:把新的数据插入到已经排好的数据列中。

  • 将第一个数和第二个数排序,然后构成一个有序序列

  • 将第三个数插入进去,构成一个新的有序序列。

  • 对第四个数、第五个数……直到最后一个数,重复第二步。

  • 如何写成代码:

  • 首先设定插入次数,即循环次数,for(int i=1;i

  • 设嫌芦信定插入数和得到已经排好序列的最后一个数的位数。insertNum和j=i-1。

  • 从最后一个数开始向前循环,如果插入数小于当前数,就将当前数向后移动一位。

  • 将当前数放置到空着的位置,即j+1。

  • 代码芹轮实现如下:

    public void insertSort(int[] a){
    int length=a.length;//数组长度,将这个提取出来是为了提高速度。
    int insertNum;//要插入的数
    for(int i=1;i//插入的次数
    insertNum=a[i];//要插入的数
    int j=i-1;//已经排序好的序列元素个数
    while(j>=0&&a[j]>insertNum){//序列从后到前循环,将大于insertNum的数向后移动一格
    a[j+1]=a[j];//元素移动一格
    j--;
    }
    a[j+1]=insertNum;//将需要插入的数放在要插入的位置。
    }
    }

    2.希尔排序

  • 对于直接插入排序问题,数据量巨大时。
  • 将数的个数设为n,取奇数k=n/2,将下标差值为k的数分为一组,构成有序序列。

  • 再取k=k/2 ,将下标差值为k的书分为一组,构成有序序列。

  • 重复第二步,直到k=1执行简单插入排序。

  • 如何写成代码:

  • 首先确定分的组数。

  • 然后对组中元素进行插入排序。

  • 然后将length/2,重复1,2步,直到length=0为止。

  • 代码实现如下:

    public void sheelSort(int[] a){
    int d = a.length;
    while (d!=0) {
    d=d/2;
    for (int x = 0; x < d; x++) {//分的组数
    for (int i = x + d; i < a.length; i += d) {//组中的元素,从第二个数开始
    int j = i - d;//j为有序序列最后一位的位数
    int temp = a[i];//要插入的元素
    for (; j >= 0 && temp < a[j]; j -= d) {//从后往前遍历。
    a[j + d] = a[j];//向后移动d位
    }
    a[j + d] = temp;
    }
    }
    }
    }

    3.简单选择排序

  • 常用于取序列中最大最小的几个数时。
  • (如果每次比较都交换,那么就是交换排序;如果每次比较完一个循环再交换,就是简单选择排序。)

  • 遍历整个序列,将最小的数放在最前面。

  • 遍历剩下的序列,将最小的数放在最前面。

  • 重复第二步,直到只剩下一个数。

  • 如何写成代码:

  • 首先确定循环次数,并且记住当前数字和当前位置。

  • 将当前位置后面所有的数与当前数字进行对比,小数赋值给key,并记住小数的位置。

  • 比对完成后,将最小的值与第一个数的值交换。

  • 重复2、3步哗亮。

  • 代码实现如下:

    public void selectSort(int[] a) {
    int length = a.length;
    for (int i = 0; i < length; i++) {//循环次数
    int key = a[i];
    int position=i;
    for (int j = i + 1; j < length; j++) {//选出最小的值和位置
    if (a[j] < key) {
    key = a[j];
    position = j;
    }
    }
    a[position]=a[i];//交换位置
    a[i]=key;
    }
    }

    4.堆排序

  • 对简单选择排序的优化。
  • 将序列构建成大顶堆。

  • 将根节点与最后一个节点交换,然后断开最后一个节点。

  • 重复第一、二步,直到所有节点断开。

  • 代码实现如下:

    public void heapSort(int[] a){
    System.out.println("开始排序");
    int arrayLength=a.length;
    //循环建堆
    for(int i=0;i-1;i++){
    //建堆

    buildMaxHeap(a,arrayLength-1-i);
    //交换堆顶和最后一个元素
    swap(a,0,arrayLength-1-i);
    System.out.println(Arrays.toString(a));
    }
    }
    private void swap(int[] data, int i, int j) {
    // TODO Auto-generated method stub
    int tmp=data[i];
    data[i]=data[j];
    data[j]=tmp;
    }
    //对data数组从0到lastIndex建大顶堆
    private void buildMaxHeap(int[] data, int lastIndex) {
    // TODO Auto-generated method stub
    //从lastIndex处节点(最后一个节点)的父节点开始
    for(int i=(lastIndex-1)/2;i>=0;i--){
    //k保存正在判断的节点
    int k=i;
    //如果当前k节点的子节点存在
    while(k*2+1<=lastIndex){
    //k节点的左子节点的索引
    int biggerIndex=2*k+1;
    //如果biggerIndex小于lastIndex,即biggerIndex+1代表的k节点的右子节点存在
    if(biggerIndex //若果右子节点的值较大
    if(data[biggerIndex]1]){
    //biggerIndex总是记录较大子节点的索引
    biggerIndex++;
    }
    }
    //如果k节点的值小于其较大的子节点的值
    if(data[k] //交换他们
    swap(data,k,biggerIndex);
    //将biggerIndex赋予k,开始while循环的下一次循环,重新保证k节点的值大于其左右子节点的值
    k=biggerIndex;
    }else{
    break;
    }
    }
    }
    }

    5.冒泡排序

  • 一般不用。
  • 将序列中所有元素两两比较,将最大的放在最后面。

  • 将剩余序列中所有元素两两比较,将最大的放在最后面。

  • 重复第二步,直到只剩下一个数。

  • 如何写成代码:

  • 设置循环次数。

  • 设置开始比较的位数,和结束的位数。

  • 两两比较,将最小的放到前面去。

  • 重复2、3步,直到循环次数完毕。

  • 代码实现如下:

    public void bubbleSort(int[] a){
    int length=a.length;
    int temp;
    for(int i=0;i for(int j=0;j-1;j++){
    if(a[j]>a[j+1]){
    temp=a[j];
    a[j]=a[j+1];
    a[j+1]=temp;
    }
    }
    }
    }

    6.快速排序

  • 要求时间最快时。
  • 选择第一个数为p,小于p的数放在左边,大于p的数放在右边。

  • 递归的将p左边和右边的数都按照第一步进行,直到不能递归。

  • 代码实现如下:

    public static void quickSort(int[] numbers, int start, int end) {
    if (start < end) {
    int base = numbers[start]; // 选定的基准值(第一个数值作为基准值)
    int temp; // 记录临时中间值
    int i = start, j = end;
    do {
    while ((numbers[i] < base) && (i < end))
    i++;
    while ((numbers[j] > base) && (j > start))
    j--;
    if (i <= j) {
    temp = numbers[i];
    numbers[i] = numbers[j];
    numbers[j] = temp;
    i++;
    j--;
    }
    } while (i <= j);
    if (start < j)
    quickSort(numbers, start, j);
    if (end > i)
    quickSort(numbers, i, end);
    }
    }

    7.归并排序

  • 速度仅次于快排,内存少的时候使用,可以进行并行计算的时候使用。
  • 选择相邻两个数组成一个有序序列。

  • 选择相邻的两个有序序列组成一个有序序列。

  • 重复第二步,直到全部组成一个有序序列。

  • 代码实现如下:

    public static void mergeSort(int[] numbers, int left, int right) {
    int t = 1;// 每组元素个数
    int size = right - left + 1;
    while (t < size) {
    int s = t;// 本次循环每组元素个数
    t = 2 * s;
    int i = left;
    while (i + (t - 1) < size) {
    merge(numbers, i, i + (s - 1), i + (t - 1));
    i += t;
    }
    if (i + (s - 1) < right)
    merge(numbers, i, i + (s - 1), right);
    }
    }
    private static void merge(int[] data, int p, int q, int r) {
    int[] B = new int[data.length];
    int s = p;
    int t = q + 1;
    int k = p;
    while (s <= q && t <= r) {
    if (data[s] <= data[t]) {
    B[k] = data[s];
    s++;
    } else {
    B[k] = data[t];
    t++;
    }
    k++;
    }
    if (s == q + 1)
    B[k++] = data[t++];
    else
    B[k++] = data[s++];
    for (int i = p; i <= r; i++)
    data[i] = B[i];
    }

    8.基数排序

  • 用于大量数,很长的数进行排序时。
  • 将所有的数的个位数取出,按照个位数进行排序,构成一个序列。

  • 将新构成的所有的数的十位数取出,按照十位数进行排序,构成一个序列。

  • 代码实现如下:

    public void sort(int[] array) {
    //首先确定排序的趟数;
    int max = array[0];
    for (int i = 1; i < array.length; i++) {
    if (array[i] > max) {
    max = array[i];
    }
    }
    int time = 0;
    //判断位数;
    while (max > 0) {
    max /= 10;
    time++;
    }
    //建立10个队列;
    List queue = new ArrayList ();
    for ( int i = 0; i < 10; i++) {
    ArrayList queue1 = new ArrayList ();
    queue.add(queue1);
    }
    //进行time次分配和收集;
    for ( int i = 0; i < time; i++) {
    //分配数组元素;
    for ( int j = 0; j < array.length; j++) {
    //得到数字的第time+1位数;
    int x = array[j] % ( int) Math. pow( 10, i + 1) / ( int) Math. pow( 10, i);
    ArrayList queue2 = queue.get(x);
    queue2.add( array[j]);
    queue. set(x, queue2);
    }
    int count = 0; //元素计数器;
    //收集队列元素;
    for ( int k = 0; k < 10; k++) {
    while ( queue.get(k).size() > 0) {
    ArrayList queue3 = queue.get(k);
    array[count] = queue3.get( 0);
    queue3.remove( 0);
    count++;
    }
    }
    }
    }

    来源:KaelQ

    地址:www.jianshu.com/p/5e171281a387

    获取方式:点“在看”,V信关注师长的小号:编程最前线并回复面试领取,更多精彩陆续奉上。

⑸ 快速排序算法原理与实现

快速排序的原理:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小。

然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

假设要排序的数组是A[1]……A[N],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一躺快速排序。一躺快速排序的算法是:

1、设置两个变量I、J,排序开始的时候I:=1,J:=N;

2、以第一个数组元素作为关键数据,赋值给X,即X:=A[1];

3、从J开始向前搜索,即由后开始向前搜索(J:=J-1),找到第一个小于X的值,两者交换;

4、从I开始向后搜索,即由前开始向后搜索(I:=I+1),找到第一个大于X的值,两者交换;

5、重复第3、4步,直到I=J。

(5)java快排扩展阅读:

设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。

值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。

一趟快速排序的算法是:

1、设置两个变量i、j,排序开始的时候:i=0,j=N-1;

2、以第一个数组元素作为关键数据,赋值给key,即key=A[0];

3、从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]的值赋给A[i];

4、从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]的值赋给A[j];

5、重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。

⑹ 快速排序的算法复杂度分析

原文地址:
快速排序的算法复杂度分析
以下是快排的java算法:

大家都知道快排的时间复杂度是O(n*ln[n]),那么这个复杂度是如何计算出来的呢?

最好的情况下,每次划分对一个记录定位后,要记录的左侧子序列与右侧子序列的长度相同。在具有n个记录的序列中,一次划分需要对整个待划分序列扫描一遍,所需的时间为O(n)。

设 是对n个记录的序列进行排序的时间,每次划分后,正好把划分区域分为长度相等的连个子序列,显然T(0)=T(1) =1,则有:

最坏的情况下,待排序的记录序列正序或逆序,每次划分只能得到一个比上一次划分少一个记录的子序列,(另一个子序列为空)。此时,必须经过n-1次递归调用才能把所有记录定位,而且第i趟划分需要经过n-i次比较才能找个才能找到第i个记录的位置,因此时间复杂度为

平均情况下,设轴值记录的关键码第k小(1≤k≤n),则有:

由上式可推出如下两式:

两式相减,然后两边同除以n(n+1)得

又因为f(n)单调递减,单调有界数列极限定理,所以f(n)有界

此数称为欧拉常数,

约为 0.57721566490153286060651209

所以

所以

**如果有何处不当,请不吝赐教,一定多加完善。谢谢 **

参考资料:

【1】《算法设计与分析》第二版 王红梅

⑺ Java冒泡排序的原理

冒泡排序是所欲排序算法里最好理解的了。
1、排序算法:
A)比较相邻的元素。如果第一个比第二个大,就交换他们两个。
B)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
C)针对所有的元素重复以上的步骤,除了最后一个。
D)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
2、给你一个java的实现代码:
public class BubbleSort{
     public static void main(String[] args){
         int score[] = {67, 69, 75, 87, 89, 90, 99, 100};
         for (int i = 0; i < score.length -1; i++){ //最多做n-1趟排序
             for(int j = 0 ;j < score.length - i - 1; j++){ //对当前无序区间score[0......length-i-1]进行排序(j的范围很关键,这个范围是在逐步缩小的)
                 if(score[j] < score[j + 1]){ //把小的值交换到后面
                     int temp = score[j];
                     score[j] = score[j + 1];
                     score[j + 1] = temp;
                 }
             }
             System.out.print("第" + (i + 1) + "次排序结果:");
             for(int a = 0; a < score.length; a++){
                 System.out.print(score[a] + "\t");
             }
             System.out.println("");
         }
             System.out.print("最终排序结果:");
             for(int a = 0; a < score.length; a++){
                 System.out.print(score[a] + "\t");
        }
     }
 }

热点内容
漫威超级战争如何配置自己装备 发布:2025-04-13 03:31:58 浏览:546
焰魔游戏解压密码 发布:2025-04-13 03:31:13 浏览:591
sqlmod函数 发布:2025-04-13 03:30:33 浏览:316
养鱼缸需要怎么样的配置 发布:2025-04-13 03:16:18 浏览:860
linqtosql语句 发布:2025-04-13 03:12:18 浏览:418
g3i小鹏汽车哪个配置好 发布:2025-04-13 03:03:07 浏览:846
php加密下载 发布:2025-04-13 03:02:31 浏览:410
c语言系统函数 发布:2025-04-13 02:44:57 浏览:964
腐烂国度生命线ce脚本 发布:2025-04-13 02:43:34 浏览:660
gcc单文件编译 发布:2025-04-13 02:42:02 浏览:562