最優化的快排,減少不必要的交換

只有當左邊的指大於pivot,右邊的值小於pivot才交換

 1 public static quickSortOptimized(int[] data,int left,int right){
 2
 3 int pivotIndex=(left+right)/2;
 4 int pivotValue=data[pivotIndex];
 5 int i=left;
 6 int j=right;
 7
 8 while(i<=j){
 9
10 //find left value greater than or equal to the pivotValue
11
12 if(data[i]<pivotValue) i++;
13
14 //find right value smaller than or equal to the pivotValue
15 if(data[j]>pivotVaule) j++;
16
17 //swapping the values in wrong places
18 if(i<=j){
19
20 swap(data,i,j);
21 i++;
22 j--;
23
24
25
26 }
27
28
29
30 }
31
32
33 //recursive
34
35 if(left<j){
36 quickSortOptimized(data,left,j);
37 }
38
39 if(right>i){
40
41 quickSortOptimized(data,i,right);
42 }
43 }
时间: 2024-08-27 02:17:36

最優化的快排,減少不必要的交換的相关文章

如何兼容並蓄Android Studio 與 Eclipse 的優點, 減少顧此失彼的缺憾

在習慣用Eclipse開發Android, 又想在過渡到Android Studio時減少衝擊. 但卻想用Android Studio來開啟Eclipse專案的話(直接開啟是不被允許的), 又不想把Eclipsec匯出的Android Studio的Gradle檔及Android Studio的兩種的專案各放置在不同位置,  又想兼容並蓄兩這的優點, 減少依賴特定一種開發環境的顧此失彼的缺憾, 也就是說: 如何兼容有在Eclipse開發的優點, 又有Android Studio的優點, 減少依賴

oracle批量插入優化方案

今天聽DBA説如果從一個表批量查詢出一批數據之後批量插入另外一張表的優化方案: 1)不寫歸檔日誌: 2)採用獨佔 關於insert /*+ append */我們需要注意以下三點: a.非歸檔模式下,只需append就能大量減少redo的產生:歸檔模式下,只有append+nologging才能大量減少redo. b.insert /*+ append */時會對錶加鎖(排它鎖),會阻塞表上的除了select以外所有DML語句: 1 --不寫日誌設置 2 ALTER TABLE my_flost

常见经典排序算法学习总结,附算法原理及实现代码(插入、shell、冒泡、选择、归并、快排等)

博主在学习过程中深感基础的重要,经典排序算法是数据结构与算法学习过程中重要的一环,这里对笔试面试最常涉及到的7种排序算法(包括插入排序.希尔排序.选择排序.冒泡排序.快速排序.堆排序.归并排序)进行了详解.每一种算法都有基本介绍.算法原理分析.算法代码. 转载请注明出处:http://blog.csdn.net/lsh_2013/article/details/47280135 插入排序 1)算法简介 插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过

Quick Sort(快排)

这是挖坑填补法的演示 快排之挖坑填补法: 1 void Quick(int top/*起始位置*/,int end/*末尾位置*/,int arr[])//挖坑填补法 2 { 3 int i=top,j=end,mark;//i是记住前面的坑 j记住后面的坑 mark记住标准值 4 5 mark=arr[top];//以起始位置作为标准值,同时起始点成为第一个坑 6 if(top>=end)return; 7 while(i<j) 8 { 9 while(i<j)//从后向前找比标准值小

快排的非递归实现

首先说明一下快速排序是对冒泡排序的改进.为什么这么说呢?想一下冒泡排序,它把序列分成了两部分,前半部分无序,后半部分升序排列,并且后半部分的数都大于前半部的数. 由此可得到快速排序和冒泡排序的一些共同点: 都要经历n趟排序 每趟排序要经历O(n)次比较 都是后半部分元素比前半部大 而不同之处就在于冒泡排序的交换操作发生相邻的元素之间,即一趟排序可以要经过多次交换操作:快速排序的交换操作发生在间隔比较远的两个元素之间,一趟排序要经过交换操作次数会少一些. 下面给出快速排序的递归和非递归实现代码:

排序(一)归并、快排、优先队列等

排序(一) 初级排序算法 选择排序 思想:首先,找到数组中最小的那个元素.其次,将它和数组的第一个元素交换位置.再次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置.如此往复,直到将整个数组排序. [图例] 图中,x轴方向为数组的索引,y轴方向为待排序元素的值. 选择排序有两个很鲜明的特点: 运行时间和输入无关.为了找出最小的元素而扫描一遍数组并不能为下一遍扫描提供什么信息.这种性质在某些情况下是缺点.(无论数组的初始状态是什么,此算法效率都一样低效) 数据移动是最少的.每次交换都

算法总结——三大排序(快排,计数排序,归并)

快排: 适用条件:方便...只要数字不是很多 复杂度:O(nlogn)  每一层n复杂度,共logn层 原理:利用一个随机数与最后面一个数交换,那么这个随机数就到了最后一位,然后循环,如果前面的数大于最后一个数,那么把这个数放到前面去,经过一次排序之后,前面的数都是大于最后一个的,然后对1到k和k+1到n进行排序,一层一层地下去 模板: #include<cstdio> #include<algorithm> #include<time.h> using namespa

普林斯顿公开课 算法3-4:快排的应用

排序的应用 排序算法有着广泛的应用. 典型的应用有 对名称进行排序 排序MP3音乐文件 显示Google的搜索结果 按标题顺序列出RSS订阅 排序之后下列问题就变得非常简单了 找出中位数 数据库中的二分查找 找出统计数据中的异常值 在邮箱中找出重复的邮件 不是特别典型的应用有 数据压缩 计算机图形 计算生物 负载平衡 编程语言中的排序算法 java中对于基本类型使用快排,对于引用类型使用归并排序.因为归并排序很稳定,而且保证复杂度为NlgN Java.C/C++中的快排都有以下特性: 对于小的子

数学之美番外篇:快排为什么那样快

目录 0. 前言 1. 猜数字 2. 称球 3. 排序 3.1 为什么堆排比快排慢 3.2 为什么快排其实也不是那么快 3.3 基排又为什么那么快呢 4. 信息论!信息论? 5. 小结 0. 前言 知道这个理论是在TopLanguage上的一次讨论,先是g9转了David MacKay的一篇文章,然后引发了牛人们的一场关于信息论的讨论.Anyway,正如g9很久以前在Blog里面所说的: 有时无知是福.俺看到一点新鲜的科普也能觉得造化神奇.刚才读Gerald Jay Sussman(SICP作者