快速排序QuickSort

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

快速排序

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

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

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

QuickSort.java

 1 package com.gxf.sort;
 2
 3 /**
 4  * 这里实现快速排序
 5  * 快速排序是对冒泡排序的一种改进
 6  * 选数组中的一个元素作为支点,通常选第一个元素
 7  * 将大于支点的元素放到支点后面,将小于支点的元素放到支点前面
 8  * 这样一趟下来,支点前面的就是小于支点元素,支点后面的大于支点元素
 9  * 每一趟划分,返回支点的位置,这样形成了两个带排序的数组,在分别对两个数组进行递归调用
10  * 直到每次划分只有一个元素
11  * @author Administrator
12  *
13  */
14 public class QuickSort {
15     /**
16      * 这里是对数组的一趟划分,返回支点在数组中的位置,默认第一个元素为支点
17      * @param Rec
18      * @param start
19      * @param end
20      * @return
21      */
22     public int quickSort(Rec rec[], int start,int end){
23         int fulcrum = rec[start].key;//fulcrum有道查的支点
24         int i = start;
25         int j = end;//分别指向开头和结束
26         while(i < j){//i==j时结束一次划分
27             while(i < j && rec[j].key > fulcrum)//找出右边比支点小的元素
28                 j--;
29             rec[i].key = rec[j].key;//右边元素之间移到支点位置即可
30             while(i < j && rec[i].key < fulcrum)//找出左边比支点大的元素
31                 i++;
32             rec[j].key = rec[i].key;//左边的大于支点元素之间交换过去
33         }
34         //这里要不要考虑相等元素的问题
35         rec[i].key = fulcrum;
36         return i;
37     }
38
39     /**
40      * 对数组进行快速排序
41      * 递归实现
42      * @param rec
43      */
44     public void sort(Rec rec[], int start, int end){
45         int index;
46         if(start < end){
47             index = quickSort(rec, start, end);
48             sort(rec, start, index - 1);
49             sort(rec, index + 1, end);//注意这里要+1要不然会无限递归,造成栈溢出
50         }
51     }
52     /**
53      * @param rec
54      */
55     public void sort(Rec rec[]){
56         sort(rec, 0, rec.length - 1);
57     }
58
59 }

Rec.java

 1 package com.gxf.sort;
 2
 3 public class Rec {
 4     public int key;
 5
 6     public Rec(int key){
 7         this.key = key;
 8     }
 9     public Rec(){
10
11     }
12     public void showArray(Rec rec[]){
13         for(int i = 0; i < rec.length ; i++){
14
15             System.out.print(rec[i].key + " ");
16         }
17     }
18     public Rec[] getRecArray(int array[]){
19         Rec result[] = new Rec[array.length];
20         for(int i = 0; i < array.length; i++){
21             result[i] =  new Rec(array[i]);
22         }
23         return result;
24     }
25 }

Test.java

 1 package com.gxf.sort;
 2
 3 public class Test {
 4
 5     public static void main(String[] args) {
 6         Rec rec = new Rec();
 7         QuickSort quickSort = new QuickSort();
 8
 9         int array[] = new int[]{0, 32, 1, 34, 54, 5, 6};
10         Rec array_rec[] = rec.getRecArray(array);
11         System.out.println("使用快速排序之前的顺序:");
12         rec.showArray(array_rec);
13
14         quickSort.sort(array_rec);
15
16         System.out.println("使用快速排序之后的顺序:");
17         rec.showArray(array_rec);
18     }
19
20 }

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

时间: 2024-12-28 06:56:26

快速排序QuickSort的相关文章

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

快速排序(Quicksort),因其排序之快而得名,虽然Ta的平均时间复杂度也是o(nlgn),但是从后续仿真结果看,TA要比归并排序和堆排序都要快. 快速排序也用到了分治思想. (一)算法实现 1 protected void quicksort(int[] array, int first, int last) { 2 3 int pivot = array[first]; 4 int i = first; 5 int j = last - 1; 6 boolean serachBig =

编程算法 - 快速排序(QuickSort)和二分查找(BinarySearch)

快速排序(QuickSort)和二分查找(BinarySearch) 本文地址: http://blog.csdn.net/caroline_wendy 快速排序和二分查找的定义, 网上书上都有, 本文主要是讲解如何写出这两个经典算法. 程序员必须掌握的两种算法, 使用任何语言, 使用纸都是必须的. 快速排序(C): /* * main.cpp * * Created on: 2014年9月10日 * Author: Spike */ #include <stdio.h> #include &

快速排序(QuickSort)

1.算法思想    快速排序是一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod). (1) 分治法的基本思想    分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题.递归地解这些子问题,然后将这些子问题的解组合为原问题的解. (2)快速排序的基本思想    设当前待排序的无序区为R[low..high],利用分治法可将快速排序的基本思想描述为:①分解:      在R[low..high]中任选一个记录作为基准

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

#include<stdio.h>int a[101],n;void quicksort(int left,int right){     int i,j,t,temp;     if(left>right)        return ;     temp=a[left];     i=left;j=right;     while(i!=j)     {         while(a[j]>=temp&&i<j)            j--;     

普林斯顿大学算法课 Algorithm Part I Week 3 快速排序 Quicksort

发明者:Sir Charles Antony Richard Hoare 基本思想: 先对数据进行洗牌(Shuffle the array) 以数据a[j]为中心进行分区(Partition),使得a[j]左侧的数据都小于等于a[j],a[j]右侧的数据都大于等于a[j] 分区完后递归排序 演示(Quicksort partitioning demo) 重复操作指导i和j指针相遇 当a[i] < a[lo]时,令i从左往右扫描 当a[j] > a[lo]时,令j从右往左扫描 交换a[i]和a[

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

背景 快速排序,是在上世纪60年代,由美国人东尼·霍尔提出的一种排序方法.这种排序方式,在当时已经是非常快的一种排序了.因此在命名上,才将之称为“快速排序”.这个算法是二十世纪的七大算法之一,平均情况下时间复杂度为Ο(nlogn),而且在O(nlogn)的情况下,实际的运算速度都要快于其他同时间复杂度的排序方法. 对东尼·霍尔以及快速排序的提出背景感兴趣的同学,可以看看这篇介绍:http://www.nowamagic.net/librarys/veda/detail/2391 排序思想 快速排

递归-快速排序quickSort

现在对“6  1  2 7  9  3  4  5 10  8”这个10个数进行排序.首先在这个序列中随便找一个数作为基准数.为了方便,就让第一个数6作为基准数吧.接下来,需要将这个序列中所有比基准数大的数放在6的右边,比基准数小的数放在6的左边,类似下面这种排列: 3  1  2 5  4  6  9 7  10  8 在初始状态下,数字6在序列的第1位.我们的目标是将6挪到序列中间的某个位置,假设这个位置是k.现在就需要寻找这个k,并且以第k位为分界点,左边的数都小于等于6,右边的数都大于等

(排序)快速排序QuickSort

主要内容: 1.算法思想 2.快速排序算法 3.划分算法partition 4.快排过程图解 5.完整代码 1.算法思想 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod). (1) 分治法的基本思想    分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题.递归地解这些子问题,然后将这些子问题的解组合为原问题的解.(2)快速排序的基本思想    设当前待排序的无

C/C++ 快速排序 quickSort

下面的动画展示了快速排序算法的工作原理. 快速排序图示:可以图中在每次的比较选取的key元素为序列最后的元素. #include <stdio.h> #include <stdlib.h> void swap(int * x, int * y) { int tmp = *x; *x = *y; *y = tmp; } void printlist(int list[],int n) { int i; for(i=0;i<n;i++) printf("%d\t&quo