package sort; import java.util.Arrays; import java.util.Random; /** * 快速排序 * 最坏复杂度:N^2 ,一般是:logn * 原理:1.任意选定一个元素key,然后将大于key 的元素放右边,小于key 的元素 放左边 * 2.将key左右两边元素分别看成一个新的数组,然后再用1 步骤方法,重复,直到只有一个元素为止 * 分离步骤: * 1.选定一个数组t[i]元素作为key,假设选第一个 ,i=0 位置开始 * * 2.用最后一个元素 j = t.length -1 和 key 做比较,也就是从后(右)开始搜索,条件i<j * 2.1 如果t[j] >= key,我们就不需要移动元素(默认大的放后(右)面),继续左移, j--. * 2.2 如果t[j] < key,将t[i] 位置放入当前小的元素t[j],t[i] = t[j]. 然后 i ++. * * 3.用前面的元素t[i],和key 做比较,也就是从前(左)开始搜索,条件i<j * 3.1 如果t[i] <= key, 我们不需要移动位置,继续 右移,i++ * 3.2 如果t[i] > key,将大的元素放右边,t[j] = t[i],然后 j--; * * 注意:2 3步骤是小的元素左移,大的元素右移,i++,j--,向中间靠拢,才能完成分离 * 4.当i<j 的时候,重复2 3步骤,直到 i = j. * 5.上面完成了一次分离,然后同理,将分离时,key 所在的位置i 作为分界线 * 把i 前面的元素,和 后面的元素 分别又进行分离,反复迭代,就可以了 * 比如:现在有a b c d e f g 7个士兵。以a为开始,作为key 拉出来比较 * 1.从g 后面开始比较,找到一个比a 矮的人,比a高的位置不动。比如现在找到f 比a 矮, * 那么就让f 到a 的位置去站着。(a 假设临时站f 的位置) * 现在是:g b c d e (a) g * 2.然后从前面开始,因为g已经比a 矮了,然后从b 开始比较。找到一个 比a 高的。 * 假设c 比 a 高,那么c 就跑到现在a 所在的位置。 * 现在是:g b (a) d e c g * 3.就这样一直到终点,就完成第一次分离了。下面就是循环 * @author @Ran * */ public class Quick<T> extends AbstractSort<T> { /** * 二分隔离法,将数据分割成以t[i] 为中线的两部分元素 其中左边的元素全部小于t[i], * 右边的元素全部大于t[i] */ public <T extends Comparable<? super T>> int dichotomieSwap(T[] t, int i,int j) { T key = t[i]; // 保证每一次 都分完 while (i < j) { // 从后面开始搜索,如果第一个元素大于key,就继续搜索,直到发现小于key // 的跳出循环 while (i < j && t[j].compareTo(key) >= 0) { j--; } // 找到第一个比key 小的元素,并赋值 if (i < j) { setValue(t, i, j); i++; } while (i < j && t[i].compareTo(key) <= 0) { // 向前开始搜索,如果搜索的第一个元素小于key,继续搜索,直到 // 发现大于key 跳出循环 i++; } if (i < j) { setValue(t, j, i); j--; } } setValue(t, i, key); // 返回这个中间元素移动到的位置 return i; } // 重写方法 public <T extends Comparable<? super T>> T[] swap(T[] t, int i, int j) { if (i < j) { // 分离 int mid = dichotomieSwap(t, i, j); // 迭代 同原理操作左边 swap(t, i, mid - 1); // 迭代,操作右边数据 swap(t, mid + 1, j); } return t; } // 重写方法 public <T extends Comparable<? super T>> T[] sort(T[] t) { return swap(t, 0, t.length - 1); } public static void main(String[] args) { int a = 30000; Integer[] t = new Integer[a]; Random r = new Random(); for (int i = 0; i < a; i++) { t[i] = r.nextInt(a); } Integer[] t2 = t.clone(); System.out.println("未排序结果:" + Arrays.toString(t)); // 这里用了下 插入排序做比较 Sort s1 = new Quick(); Sort s2 = new Insertion(); s1.sort(s1, t); s2.sort(s2, t2); System.out.println("排序后结果:" + Arrays.toString(t)); System.out.println(s1); System.out.println(s2); } }
图例参考:http://blog.csdn.net/wxwzy738/article/details/7832737
小结:这个算算法有很多改进之处,并且各种效率针对的情况不同,后面有机会再逐步分析
排序个人认为对小数据没什么意义的,大量数据才能看出效果,根据数据的不同,采取不同的排序
相关推荐
数据结构与算法 - 快速排序算法实现报告 在数据结构与算法的学习过程中,快速排序算法是一种重要的排序算法,它具有排序速度快、就地排序的优点,但也具有不稳定性。以下是快速排序算法的详细实现报告。 快速排序...
快速排序算法是一种高效的排序算法,它的工作原理是通过选择一个元素作为pivot,然后将数组分为两个部分,以达到排序的目的。快速排序算法的时间复杂度为O(n log n),因此它适合大规模的数据排序。 5.归并排序算法 ...
(matlab代码)带约束条件的非支配排序遗传算法NSGA-II,解决了一个多目标优化问题 (matlab代码)带约束条件的非支配排序遗传算法NSGA-II,解决了一个多目标优化问题 (matlab代码)带约束条件的非支配排序遗传算法...
各类排序算法整理--C语言描述--本人编写 排序算法种类有: 冒泡 快速排序 堆排序 希尔排序 插入排序 选择排序 二路归并排序
快速排序是一种高效的排序算法,由C.A.R. Hoare在1960年提出。它的基本思想是通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分数据分别...
本篇文章主要探讨了如何在VC++环境中利用多线程技术来实现三种经典的排序算法:冒泡排序、快速排序和归并排序,并对它们的性能进行了比较。 首先,冒泡排序是一种简单的排序算法,它重复地遍历待排序的数列,一次...
本篇文章将详细讨论几种常见的排序算法:选择排序、冒泡排序、插入排序、合并排序以及快速排序,分析它们的算法原理、时间效率,并通过经验分析验证理论分析的准确性。 **1. 选择排序(Selection Sort)** 选择排序...
本文将深入探讨标题和描述中提到的一些基本排序算法,包括选择排序、冒泡排序、插入排序、希尔排序、堆排序、快速排序以及归并排序,并结合C++编程语言进行讲解。 1. **选择排序(Selection Sort)** - 选择排序是一...
经典排序算法 - 快速排序Quick sort 经典排序算法 - 桶排序Bucket sort 经典排序算法 - 插入排序Insertion sort 经典排序算法 - 基数排序Radix sort 经典排序算法 - 鸽巢排序Pigeonhole sort 经典排序算法 - ...
本文将对快速排序、归并排序、堆排序等常见排序算法进行比较和分析,探讨它们的优缺点和适用场景。 首先, let's 看一下这些排序算法的时间复杂度和空间复杂度: | 排序算法 | 平均情况 | 最好情况 | 最坏情况 | ...
将杂乱无章的数据元素,通过一定的方法按关键字顺序排列的过程叫做排序。...本资源通过matlab实现合并排序、简单选择排序、快速排序、冒泡排序、直接插入排序5种常用的排序算法,并部分绘制代表算法原理的动图。
此文件为数据结构中的九种排序算法,包含一些排序方法的过程,其九种排序包括:直接插入排序,折半插入排序,希尔排序,冒泡排序,快速排序,选择排序,堆排序,归并排序,基数排序!
在计算机科学领域,排序算法是数据结构中至关重要的一部分,它涉及到如何有效地重新排列一组数据,使其按照特定的顺序(如升序或降序)排列。本资料“排序算法图解”将深入探讨这一主题,通过可视化的方式帮助我们...
在这个例子中,可能会有一个类`SortAlgorithms`包含各种排序算法的成员函数,如冒泡排序、选择排序、插入排序、快速排序等。另一个类`UserInterface`则负责处理用户交互和控制执行哪种排序算法。 3. **排序算法的...
算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...
快速排序是一种常用的排序算法,它的效率在许多情况下非常高。其核心思想是选择一个"枢轴"(pivot)元素,然后将数组分为两部分:一部分包含小于枢轴的元素,另一部分包含大于枢轴的元素。递归地对这两部分继续执行...
在实际应用中,通常会选择时间复杂度更低的排序算法,如快速排序、归并排序或堆排序,它们在大多数情况下能提供更好的性能。然而,理解这些基础排序算法有助于我们更好地掌握排序的本质,以及如何根据具体需求选择...
七大排序算法如下: 交换排序:快速排序quicksort,冒泡排序bubblesort 选择排序:直接选择排序selectionsort,堆排序maxheapsort 插入排序:直接插入排序insertsort,希尔排序shellsort 合并排序:归并排序...
快速排序(Quick Sort)是一种分治思想的排序算法,它的基本思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,然后再分别对这两部分记录继续进行排序,以达到...
快速排序是一种高效的排序算法,由C.A.R. Hoare在1960年提出,它采用了分治(Divide and Conquer)策略。快速排序的基本思想是通过一趟排序将待排序的数据分割成两部分,其中一部分的所有数据都比另一部分的所有数据...