首页 > 编程知识 正文

java实现快速排序,java快速排序算法代码

时间:2023-05-04 08:17:02 阅读:19858 作者:1109

一、快速排序思想选择比较的标准,将待排序的数据分为独立的两部分,左侧均在标准以下,右侧均在标准以上,然后对左侧部分和右侧部分分别重复前面的过程,即左侧部分选择另一个标准,又两个独立的最后,整个序列变得有序

1、快速排序方式(选择标准方式)为:固定位置选择标准法随机选择标准法中法实现排序可以利用递归和非递归两种方式

2、快速排序优化:待排序序列中,待排序数字稍有固定个数时,直接插入排序采用相同的基准元素聚集方法(待排序数据中有很多相同的数据) 3、复杂度、稳定性、优点http://www

最坏的情况: O(N2 ) ) ) ) )。

33558www.Sina.com/:o(log2n ) )。

时间复杂度:不稳定

空间复杂度:快速排序是对气泡排序的增强,在气泡排序中,数据的比较和移动在两个相邻位置进行,每次交换数据时只能移动到一个位置,因此总的比较次数和移动次数较多,快速排序

4、图标固定位置选择基准法定义三个变量: low、high和tmp

将l放入tmp,如果前面有空位,则从high后面向前寻找小于tmp的值,放入前面的空位; 如果后面有空的话,从l开始向后寻找大于tmp的值,放入后面的空的。 在l和h相遇之前,将tmp放入相遇位置(以该位置为基准)。 此时,可知tmp左边的值都小于tmp,右边的值都大于tmp。 第一次排序完成,按顺序递归排序标准左右两侧的数据。

稳定性

//1 .固定位置选择基准法int tmp=array[low]; while(lowhigh ) (while ) lowhigharray[high]=tmp )/high的值大于tmp,high--; (if )低=高) { break; } else { array[low]=array[high]; }while(lowhigharray[low]=tmp ) low的值小于tmp,判断下一个low; if(low=high ) { break; } else { array[high]=array[low]; } } } array[low]=tmp; 返回低; )随机选择准则法(防止排序对象数据排序)随机选择一个数字,交换0号位置,将其数放入tmp,后面查找小于0的数,放入0号位置,h,前面查找大于0的数,l。

优点

publicstaticvoidswap (int [ ] array,int low,int high ) /交换low编号下标和随机数下标的值int tmp=array[low]; 阵列[ low ]=array [ high ]; array[high]=tmp; } publicstaticvoidquick1(int [ ] array,int low,int high ) { Random random=new Random ); int rannum=random.nextint (high-low1) low; swap(array,low,ranNum ); intpar=partion(Array,low,high ); if(parlow1 )//左边有两个元素。 开始low为0,par 1,2在下标位置quick(array,low,par-1 ); (if ) parhigh-1 ) ) /右边有两个元素:开始位置par 1和快速(阵列、par 1和high )。 } publicstaticvoidquicksort1(int [ ] array ) quick ) array,0,array.length-1 ); 6 )三分取中法(预防排序对象数据有序)三个参数: low、high、mid分别下标0号、最大大小下标、最中间下标、比较三者的值,比较中间大的数字low、最大的数字high、最小的代码:

/strong>

public static void midThree(int[] array, int low, int high){ //array[mid] <= array[low] <= array[high] 把中间大的数字放在第一个,最大的放在最后,最小的放在中间 int mid = (high + low)/2; //中间位置的下标 if(array[low] > array[high]){ swap(array,low,high); } //array[low] <= array[high] if(array[mid] > array[high]){ swap(array,mid,high); }//array[mid] <= array[high] if(array[mid] > array[low]){ swap(array,low,mid); }//array[mid] <= array[low]} 二、递归和非递归实现快速排序 1、递归实现:函数调用自己本身 public static void quick(int[] array,int low,int high){ //low和high的值一直在发生改变,所以用递归找 int par = partion(array,low,high);//par将数组分为两边 if(par > low+1){ //左边有两个元素:起始low为0,par>1+0,在2号下标的位置, quick(array,low,par-1); } if(par < high-1){ //右边有两个元素:起始位par+1, quick(array,par+1,high); }}public static void quickSort(int[] array){ quick(array,0,array.length-1);} 2、非递归实现

需要栈来实现,现将low和high按顺序放入栈中,一次出栈两个值,出栈的第一个为high,第二个为low。
注:在java中求log2N,首先要弄明白一个初中学到的公式
log2N=logeN/loge2,
logeN代表以e为底的N的对数,loge2代表以e为底的2的对数,在java.lang.math类中的log(double a)代表以e为底的a的对数,因此log2N在Java中的表示为:log((double)N)/log((double)2)

public static void quickSort2(int[] array) { int len = (int) (log((double) array.length) / log((double) 2)); int[] stack = new int[2 * len];//数组写的栈. 大小log2n int top = 0; int low = 0; int high = array.length - 1; int par = partion(array, low, high); //把数组分为两部分 if (par > low + 1) { //把左边和右边的low和high的值分别按先low后high的顺序压栈 stack[top++] = low; stack[top++] = par - 1; } if(par < high -1) { stack[top++] = par + 1; stack[top++] = high; } //一次出栈两个值,low和high。 把low放入tmp,判断和h的大小 while (top > 0) { high = stack[--top]; low = stack[--top]; par = partion(array, low, high); if (par > low + 1) { stack[top++] = low; stack[top++] = par - 1; } if (par < high - 1) { stack[top++] = par + 1; stack[top++] = high; } } 三、快排的优化 1、当某个区间需要排序的数据为一定范围时,进行直接插入排序 public static void insertSort(int[] array, int low, int high){ int tmp,j; for (int i = low+1; i <= high; i++) { tmp = array[i]; for (j = i-1; j >=low; j--) { if (array[j] > tmp) { array[j + 1] = array[j]; } break; } array[j+1] = tmp; } } 2、聚集相同基准元素法

待排序数据中有很多相同的数据时,要进行优化,则采取这个方式
在基准(par)的左边和右边分别定义一个值,par_left和par_right,
先判断基准右边:定义变量i,判断i下标的值是否和par对应的值相等,不相等的话,i++;相等的话par_right和i先交换,然后par_right和i的下标都+1.
再用相同的方法判断基准的左边,

public static int[] Focus_Same_Num(int[] arr, int low, int par, int high, int left, int right) { // 右边 int par_right = par + 1; for (int i = par + 1; i <= high; i++) { //右边 if (arr[i] == arr[par]) { //相同的话pr和i先交换再pr和i都++ if (i != par_right) { //不是紧挨着 swap(arr, i, par_right); par_right++; } else { //紧挨着,不用交换,比较下一个 par_right++; } } } right = par_right; //左 边 int par_left = par - 1; for (int j = par - 1; j >= low; j--) { //左边 if (arr[j] == arr[par]) { if (j != par_right) { //不是紧挨着 swap(arr, j, par_left); par_left--; } else { //紧挨着,不用交换,比较下一个 par_left--; } } } left = par_left; int[] temp = new int[2]; temp[0] = left; temp[1] = right; return temp;}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。