前几天实现了直接插入排序、冒泡排序和直接选择排序这三个基础排序。今天看了一下冒泡排序的改进算法,快速排序。单独记录一下,后面还有归并和基数排序等

快速排序

1.选择一个支点默认为数组第一个元素及array[start]作为支点,将所有大于支点元素的值放到支点后面,将所有小于支点元素的值放到支点前面,完成一次划分,返回支点的位置index

2.通过一个划分形成两个带排序的序列,[start, index - 1]和[index + 1, end]两个,在执行1直到序列元素只有1个则已经完成排序

具体解释和注意代码注释中有说明

QuickSort.java

 package com.gxf.sort;

 /**
* 这里实现快速排序
* 快速排序是对冒泡排序的一种改进
* 选数组中的一个元素作为支点,通常选第一个元素
* 将大于支点的元素放到支点后面,将小于支点的元素放到支点前面
* 这样一趟下来,支点前面的就是小于支点元素,支点后面的大于支点元素
* 每一趟划分,返回支点的位置,这样形成了两个带排序的数组,在分别对两个数组进行递归调用
* 直到每次划分只有一个元素
* @author Administrator
*
*/
public class QuickSort {
/**
* 这里是对数组的一趟划分,返回支点在数组中的位置,默认第一个元素为支点
* @param Rec
* @param start
* @param end
* @return
*/
public int quickSort(Rec rec[], int start,int end){
int fulcrum = rec[start].key;//fulcrum有道查的支点
int i = start;
int j = end;//分别指向开头和结束
while(i < j){//i==j时结束一次划分
while(i < j && rec[j].key > fulcrum)//找出右边比支点小的元素
j--;
rec[i].key = rec[j].key;//右边元素之间移到支点位置即可
while(i < j && rec[i].key < fulcrum)//找出左边比支点大的元素
i++;
rec[j].key = rec[i].key;//左边的大于支点元素之间交换过去
}
//这里要不要考虑相等元素的问题
rec[i].key = fulcrum;
return i;
} /**
* 对数组进行快速排序
* 递归实现
* @param rec
*/
public void sort(Rec rec[], int start, int end){
int index;
if(start < end){
index = quickSort(rec, start, end);
sort(rec, start, index - );
sort(rec, index + , end);//注意这里要+1要不然会无限递归,造成栈溢出
}
}
/**
* @param rec
*/
public void sort(Rec rec[]){
sort(rec, , rec.length - );
} }

Rec.java

 package com.gxf.sort;

 public class Rec {
public int key; public Rec(int key){
this.key = key;
}
public Rec(){ }
public void showArray(Rec rec[]){
for(int i = 0; i < rec.length ; i++){ System.out.print(rec[i].key + " ");
}
}
public Rec[] getRecArray(int array[]){
Rec result[] = new Rec[array.length];
for(int i = 0; i < array.length; i++){
result[i] = new Rec(array[i]);
}
return result;
}
}

Test.java

 package com.gxf.sort;

 public class Test {

     public static void main(String[] args) {
Rec rec = new Rec();
QuickSort quickSort = new QuickSort(); int array[] = new int[]{0, 32, 1, 34, 54, 5, 6};
Rec array_rec[] = rec.getRecArray(array);
System.out.println("使用快速排序之前的顺序:");
rec.showArray(array_rec); quickSort.sort(array_rec); System.out.println("使用快速排序之后的顺序:");
rec.showArray(array_rec);
} }

ps:这里主要参考了西电版的数据结构

快速排序QuickSort的更多相关文章

  1. 算法实例-C#-快速排序-QuickSort

    算法实例 ##排序算法Sort## ### 快速排序QuickSort ### bing搜索结果 http://www.bing.com/knows/search?q=%E5%BF%AB%E9%80% ...

  2. 快速排序(quicksort)算法实现

    快速排序(quicksort)是分治法的典型例子,它的主要思想是将一个待排序的数组以数组的某一个元素X为轴,使这个轴的左侧元素都比X大,而右侧元素都比X小(从大到小排序).然后以这个X在变换后数组的位 ...

  3. 归并排序(MergeSort)和快速排序(QuickSort)的一些总结问题

    归并排序(MergeSort)和快速排序(QuickSort)都是用了分治算法思想. 所谓分治算法,顾名思义,就是分而治之,就是将原问题分割成同等结构的子问题,之后将子问题逐一解决后,原问题也就得到了 ...

  4. json数据中的某一个字段进行快速排序quicksort

    快速排序(Quicksort)是对冒泡排序的一种改进,是一种分而治之算法归并排序的风格. 核心的思想就是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小 ...

  5. 排序算法四:快速排序(Quicksort)

    快速排序(Quicksort),因其排序之快而得名,虽然Ta的平均时间复杂度也是O(nlgn),但是从后续仿真结果看,TA要比归并排序和堆排序都要快. 快速排序也用到了分治思想. (一)算法实现 pr ...

  6. 随手编程---快速排序(QuickSort)-Java实现

    背景 快速排序,是在上世纪60年代,由美国人东尼·霍尔提出的一种排序方法.这种排序方式,在当时已经是非常快的一种排序了.因此在命名上,才将之称为"快速排序".这个算法是二十世纪的七 ...

  7. 这个代码怎么改??Help快速排序 quicksort

    #include<stdio.h>int a[101],n;void quicksort(int left,int right){     int i,j,t,temp;     if(l ...

  8. C/C++ 快速排序 quickSort

    下面的动画展示了快速排序算法的工作原理. 快速排序图示:可以图中在每次的比较选取的key元素为序列最后的元素. #include <stdio.h> #include <stdlib ...

  9. 排序算法TWO:快速排序QuickSort

    import java.util.Random ; /** *快速排序思路:用到了分治法 * 一个数组A[0,n-1] 分解为三个部分,A[0,p - 1] , A[p] , A[p + 1, n-1 ...

随机推荐

  1. 用PHP实现守护进程任务后台运行与多线程(php-resque使用说明)

    消息队列处理后台任务带来的问题 项目中经常会有后台运行任务的需求,比如发送邮件时,因为要连接邮件服务器,往往需要5-10秒甚至更长时间,如果能先给用户一个成功的提示信息,然后在后台慢慢处理发送邮件的操 ...

  2. oracle 强杀进程

    在ORACLE数据库当中,有时候会使用ALTER SYSTEM KILL SESSION 'sid,serial#'杀掉一个会话进程,但是使用这个SQL语句杀掉会话后,数据库并不会立即释放掉相关的资源 ...

  3. ASP.NET验证控件二

    RequiredFieldValidator 验证控件 页面布局: <div> <h1>RequiredFieldValidator 验证控件</h1>   用户名 ...

  4. Linux 常用ps命令

    (1)查看系统所有进程: 标准格式:           ps -e           ps -ef           ps -eF           ps -ely   BSD格式:     ...

  5. POJ C程序设计进阶 编程题#2: 配对碱基链

    编程题#2: 配对碱基链 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 脱 ...

  6. HTML5 <meta> 标签属性,所有meta用法都在这里了

    基本标签SEO 优化为移动设备添加 viewportWindows 8其他 禁止数字识自动别为电话号码不让android识别邮箱每 8 秒刷新一次页面移动端的头部标签和meta 基本标签 声明文档使用 ...

  7. js实现文字字幕滚动

    <div class="dggd_r" id="h" style="height:400px;overflow:hidden;display:i ...

  8. kettle教程(1) 简单入门、kettle简单插入与更新。打开kettle

    本文要点:Kettle的建立数据库连接.使用kettle进行简单的全量对比插入更新:kettle会自动对比用户设置的对比字段,若目标表不存在该字段,则新插入该条记录.若存在,则更新.   Kettle ...

  9. SequoiaDB的数据分区操作

    在SequoiaDB集群环境中,用户往往将数据存放在不同的逻辑节点与物理节点中,以达到并行计算的目的. 分区:把包含相同数据的一组数据节点叫一个分区,如上图绿色方块组成三个分区. 分区键:切分时,所依 ...

  10. Android判断横屏竖屏代码

    // 判断Android当前的屏幕是横屏还是竖屏.横竖屏判断 if (this.getResources().getConfiguration().orientation == Configurati ...