关闭

剑指offer中的快排

标签: 简单的排序
155人阅读 评论(0) 收藏 举报
分类:

一、快速排序的思想。
每一次的快排,都是选定一个坐标,把一个数组分隔成两部分。一边是比坐标的数大的数,一边是比坐标的数小的数。
之后把分隔的两个部分在各自选取一个坐标,在分别进行分隔。直到分隔的区间只剩一个数为止。
习惯上把标志位的数放在数组的最后一位上,这样方便进行比较。
这里写图片描述
快排的一部分过程
二、快速排序的代码。
public class QuickSort {
int [] array = null;
int length = 0;

public QuickSort(int [] array) {
    this.array = array;
    this.length = array.length;
}
private void Swap (int i,int j){
    int temp;
    temp = array[i];
    array[i] = array[j];
    array[j] = temp;
}

private int RandomSubscript(int start,int end){
    int index = (int)(Math.random()*(end-start+1)+start);
    return index;
}

private int partition(int start,int end){
    int small = -1;
    int index = RandomSubscript(start, end);
    Swap(index , end);
    small = start-1;
    for(index = start ; index < end ; index++){
        if(array[index] < array[end]){
            ++small;
            if(small != index){
                Swap(small, index);
            }
        }
    }
    ++small;
    Swap(small,end);
    return small;

}

public void printSqrt(){
    for(int i = 0 ; i < array.length ; i++){
        System.out.print(array[i]+"  ");
    }
    System.out.println();
}

public void quickSqrt(int start,int end){
    if(array ==null||array.length<=0){
        System.out.println("数组不合法,无法进行排序");
        return;
    }
    if(start<end){
        int index = partition(start,end);
        if(index > start){
            quickSqrt(start,index-1);
        }
        if(index < end){
            quickSqrt(index+1,end);
        }
    }
    return ;
}

}
代码详解:
small是用来卡主比选中的小的数,将比选中的数小的数放在左边,大的数放在右边。small所在的位置是当前最近的比标志数小的数,small之前(包括small)都是比标志数小的数,之后的数都是不确定的。在跳出循环后,small之前(包括)之前的都是比标志位小的,small之后(除了标志位)都是比标志位大的。所以跳出循环后只需要把标志位和samll后面的一个数一交换就可以了。

0
0
查看评论

剑指offer——快速排序

快速排序是目前所有排序中性能较好的一种算法,最好情况和平均情况下时间复杂度均为O(nlogn),最坏的情况下时间复杂度为O(n^2)。快速排序采用递归,用空间换取时间。由于使用了递归,因此需要额外的存储空间。         快速排序由三个函数构成...
  • u010425776
  • u010425776
  • 2016-03-06 15:45
  • 1594

剑指Offer--排序算法小结

Offer来了(Java版)——排序算法小结前言     毕业季转眼即到,工作成为毕业季的头等大事,必须得认认真真进行知识储备,迎战笔试、电面、面试。     许久未接触排序算法了。平时偶尔接触到时自己会不假思索的百度,然后就是Ctrl+C...
  • sunhuaqiang1
  • sunhuaqiang1
  • 2016-07-29 08:31
  • 47095

剑指offer 快速排序

1.快速排序,0,1,2..n-1,   选出枢纽元index,交换a[index]与a[n-1],将小于a[n-1]的元素放在左边,大于的元素放在右边,递归分别对两组进行排序 #include using namespace std; #include int RandomInRang...
  • yuhan_9204
  • yuhan_9204
  • 2015-06-09 15:47
  • 414

剑指Offer系列---(10)快速排序

1.题目描述: 快速排序 2.分析: 实现快速排序算法的关键在于先在数组中选择一个数字,接下来把数组中的数字分为两部分,比选择的数字小的移到数组的左边,比选择的数字大的数字移到数组的右边。 3.源代码: // Copyright (c) 2015年 skewrain. All rights re...
  • SkewRain
  • SkewRain
  • 2015-09-09 13:05
  • 945

剑指offer—第二章算法之快速排序

算法:排序和查找(二分查找,归并排序,快速排序),位运算等。 查找:顺序查找,哈希查找,二叉排序树查找,哈希表。 二分查找可以解决:"旋转数组中的最小数字","数字在排序数组出现的次数"等问题。 哈希表:优点:O(1)时间内查找一个元素的效率最高。 &...
  • skp127
  • skp127
  • 2016-05-17 21:44
  • 491

【剑指offer】数组中的逆序对

思路:最简单的方法是顺序数组,将每个数字与后面的比较,统计逆序对的个数,这种方法的时间复杂度为O(n*n),这种方法写出的代码在九度OJ上测试,会超时。剑指offer给出了归并排序的思路,这个有点难想到啊,也可能是我太弱了,根本没往这方面想!理解了思路,就不难了,将数组划分成两个子数组,再将子数组分...
  • mmc_maodun
  • mmc_maodun
  • 2014-05-30 08:49
  • 4579

算法----快排算法

实际上快排算很好理解:          举个例子:有一个数组a,在数组中选择一个数x,然后把数组中所有小于等于x的数放到x左边,大于x的数放到右边,然后再利用分治递归思想把整个数组排成有序系列。 其实现代码如下: #include using n...
  • chenxun2009
  • chenxun2009
  • 2015-09-14 19:59
  • 1468

C++快排调用

在现在的各种内部排序算法中快速排序被认为是效率最高的排序算法(快速排序原理),因此在C++的库函数中已经封装了快排函数。所以在平时的编程,我们可以直接调用这已库函数,而不必自己去实现。这样一方面由快排保证了程序的效率,另一方面也保证程序的正确性和可读性。调用c++快排的库函数的格式: 假设待排序的...
  • fores_t
  • fores_t
  • 2017-07-12 12:23
  • 390

【算法】5 传说中的快排是怎样的,附实现示例

快速排序(英文名:Quicksort,有时候也叫做划分交换排序)是一个高效的排序算法,由Tony Hoare在1959年发明(1961年公布)。当情况良好时,它可以比主要竞争对手的归并排序和堆排序快上大约两三倍。这是一个分治算法,而且它就在原地排序。 所谓原地排序,就是指在原来的数据区域内进行重排...
  • NoMasp
  • NoMasp
  • 2015-06-02 23:02
  • 11690

C++中快排模板调用

在现在的各种内部排序算法中快速排序被认为是效率最高的排序算法(快速排序原理),因此在C++的库函数中已经封装了快排函数。所以在平时的编程,我们可以直接调用这已库函数,而不必自己去实现。这样一方面由快排保证了程序的效率,另一方面也保证程序的正确性和可读性。   调用c++快排的库...
  • yeyang911
  • yeyang911
  • 2013-12-07 21:47
  • 1140
    个人资料
    • 访问:464次
    • 积分:73
    • 等级:
    • 排名:千里之外
    • 原创:7篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条