研磨数据结构与算法-09快速排序

快速排序:

/*

* 快速排序

*/

public class QuickSort {

/**

* 划分数组

*/

public static int partition(long arr[],int left, int right,long point) {

int leftPtr = left - 1;

int rightPtr = right;

while(true) {

//循环,将比关键字小的留在左端

while(leftPtr < rightPtr && arr[++leftPtr] < point);

//循环,将比关键字大的留在右端

while(rightPtr > leftPtr && arr[--rightPtr] > point);

if(leftPtr >= rightPtr) {

break;

} else {

long tmp = arr[leftPtr];

arr[leftPtr] =  arr[rightPtr];

arr[rightPtr] = tmp;

}

}

//将关键字和当前leftPtr所指的这一个进行交换

long tmp = arr[leftPtr];

arr[leftPtr] =  arr[right];

arr[right] = tmp;

return leftPtr;

}

public static void displayArr(long[] arr) {

System.out.print("[");

for(long num : arr) {

System.out.print(num + " ");

}

System.out.print("]");

System.out.println();

}

public static void sort(long[] arr, int left, int right) {

if(right - left <= 0) {

return;

} else {

//设置关键字

long point = arr[right];

//获得切入点,同时对数组进行划分

int partition = partition(arr, left, right, point);

//对左边的子数组进行快速排序

sort(arr,left,partition - 1);

//对右边的子数组进行快速排序

sort(arr,partition + 1, right);

}

}

}

测试:

public class TestQuickSort {

public static void main(String[] args) {

long[] arr  = new long[10];

for(int i = 0; i < 10;i++) {

arr[i] = (long) (Math.random() * 99);

}

QuickSort.displayArr(arr);

QuickSort.sort(arr, 0, arr.length - 1);

QuickSort.displayArr(arr);

}

}

时间: 2024-12-17 05:43:23

研磨数据结构与算法-09快速排序的相关文章

python数据结构与算法 35 快速排序

快速排序 快速排序也使用了分而治之的策略来提高性能,而且不需要额外的内存,但是这么做的代价就是,列表不是对半切分的,因而,性能上就有所下降. 快速排序选择一个数值,一般称为"轴点",虽然有很多选取轴点的方法,我们还是简单地把列表中第一个元素做为轴点了.轴点的作用是帮助把列表分为两个部分.列表完成后,轴点所在的位置叫做"切分点",从这一点上把列表分成两部分供后续调用. 图12所示,54将作为轴点.这个例子我们已经排过多次了,我们知道54在排好序后将处于现在31的位置上

数据结构排序算法之快速排序

排序算法包括很多种,其中快速排序是其中一种比较快的排序算法,今天就来介绍一下: 快速排序的基本实现思想就是将当前待排序列分成两个部分.一个值.一个值:就是选定出一个值作为被比较的元素.两个部分:所有比该被选定元素大的部分都去该元素的右边,所有比被选定元素小的部分都去该元素的左边.这样我们就确定了该元素在这个待排序列中的位置,其实也就是我们已经将这个元素“排好了”. 那么,怎么才能完成一次的快速排序呢? 我们选定一个被比较的元素,一般都是选第一个,即数组中第一个元素作为val,然后我们给出两个指针

Python实现的数据结构与算法之快速排序详解

一.概述 快速排序(quick sort)是一种分治排序算法.该算法首先 选取 一个划分元素(partition element,有时又称为pivot):接着重排列表将其 划分 为三个部分:left(小于划分元素pivot的部分).划分元素pivot.right(大于划分元素pivot的部分),此时,划分元素pivot已经在列表的最终位置上:然后分别对left和right两个部分进行 递归排序. 其中,划分元素的 选取 直接影响到快速排序算法的效率,通常选择列表的第一个元素或者中间元素或者最后一

C语言版数据结构及算法_快速排序

/* 参数: a:数组首地址 left:需要排序的数组的开始位置 right:需要排序的数组的结束位置 */ void qSort(int *a,int left,int right){ //快速排序 if (left>=right) { return; }else{ int value=a[left]; int initLeft=left; int initRight=right; while (left!=right) { while (value<a[right]) { right--;

【数据结构与算法】—— 快速排序

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列.[来自百度百科] 快排介绍 老样子,前面有介绍 快排思路 快速排序,在学习的时候,老师就说,快排,是分而治之.就像中国 960 万疆土,分成省市县镇乡村去管辖.这就是分而治之.在各自的辖区内,各自管辖,互不干涉,最后再把结果汇总,就形成了我中华960万的疆土.那这个辖区怎么划分?这就需要一个标准,这

研磨数据结构与算法-02双端链表与双向链表

Node节点: /* * 链结点,相当于是车厢 */ public class Node { //数据域 public long data; //指针域 public Node next; public Node previous; public Node(long value) { this.data = value; } /** * 显示方法 */ public void display() { System.out.print(data + " "); } } 双端链表: /*

研磨数据结构与算法-13删除二叉树节点

节点: /* * 二叉树节点 */ public class Node { //数据项 public long data; //数据项 public String sData; //左子节点 public Node leftChild; //右子节点 public Node rightChild; /** * 构造方法 * @param data */ public Node(long data,String sData) { this.data = data; this.sData = sDa

研磨数据结构与算法-14红黑树

红黑树: public class RBTree { private final Node NIL = new Node(null,null,null,Color.BLACK,-1); private Node root; public RBTree() { root = NIL; } public RBTree(Node  root) { this.root = root; } //插入节点 public void rbInsert(Node node) { Node previous = N

研磨数据结构与算法-11二叉树的基本操作

节点: /* * 二叉树节点 */ public class Node { //数据项 public long data; //数据项 public String sData; //左子节点 public Node leftChild; //右子节点 public Node rightChild; /** * 构造方法 * @param data */ public Node(long data,String sData) { this.data = data; this.sData = sDa