• 用 Java 实现一个快速排序算法


           快速排序是排序算法中效率最高的一种,它是利用递归的原理,把数组无限制的分成两个部分,直到所有数据都排好序为止。

           快速排序是对冒泡排序的一种改进。它的基本思想是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

           如果要排序的数组是 A[1]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为中间数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。一趟快速排序的算法如下所示:

    (1)设置两个变量 i、 j,排序开始的时候:i = 1,j = N–1。

    (2)以第一个数组元素作为中间数据,赋值给 privot,即 pivot = A[0]。

    (3)从 j 开始向前搜索,即由后开始向前搜索(j--),找到第一个小于 X 的值。

    (4)从 i 开始向后搜索,即由前开始向后搜索(i++),找到第一个大于 X 的值,并与上一步找到的数字交换。

    (5)重复第3、4步,直到 i >= j。

    (6)然后把 j 所在的数字与 pivot 交换。

    (7)最后把 j 以前的数组和 j 到最后的数组,再进行递归的快速排序。

    以下是该题目的代码实现:

      1 package com.fhcq.quicksort;
      2 
      3 public class QuickSort {
      4 
      5 	public static void main(String[] args) {
      6 		// TODO Auto-generated method stub
      7 
      8 		int[] a = new int[] { 5, 9, 8, 4, 7, 3, 6, 2 }; //定义数组
      9 		print(a); //打印之前的顺序
     10 		sort(a, 0, a.length-1); //排序
     11 		print(a); //打印排序后的结果
     12 	}
     13 
     14 	//打印方法
     15 	private static void print(int[] before) {
     16 		// TODO Auto-generated method stub
     17 		for (int i = 0; i < before.length; i++) { //遍历
     18 			System.out.print(before[i] + ""); //打印,以空格隔开
     19 		}
     20 		System.out.println(); //换行
     21 	}
     22 
     23 	//排序方法
     24 	 static void sort(int[] a, int low, int high) {
     25 		// TODO Auto-generated method stub
     26 		if(low >= high){ //low小于或等于high,则直接返回
     27 			return;
     28 		}
     29 		if((high - low) == 1){ //如果只有两个数字,则直接比较
     30 			if(a[0] > a[1]){
     31 				swap(a, 0, 1);
     32 				return;
     33 			}
     34 		}
     35 		int pivot = a[low]; //取第一个数作为中间数
     36 		//左滑块当前的下标数,从第2个数字开始,从最后一个开始
     37 		int left = low + 1;
     38 		int right = high; //右滑块当前的下标数
     39 		while(left < right){ //左右循环
     40 			//从左边开始找
     41 			while(left < right && left <= high){ //如果左小于右则一直循环
     42 				if(a[left] > pivot){ //找到一个大的数字
     43 					break;
     44 				}
     45 				left++; //左下标往右边走一点
     46 			}
     47 			//从右边开始找
     48 			while(left <= right && right > low){ //如果左大于右则一直循环
     49 				if(a[right] <= pivot){ //找到一个小的数字
     50 					break;
     51 				}
     52 				right--; //右下标往左走一点
     53 			}
     54 			if(left < right){ //如果还没找完,则交换数字
     55 				swap(a,right,left);
     56 			}
     57 
     58 		swap(a,low,right); //交换中间数字
     59 		sort(a,low,right); //排序前面的数组
     60 		sort(a,right+1,high); //排序后边数组
     61 		}
     62 	}
     63 
     64 	 //掉位方法
     65 	private static void swap(int[] array, int i, int j) {
     66 		// TODO Auto-generated method stub
     67 
     68 		int temp;
     69 		temp = array[i];
     70 		array[i] = array[j];
     71 		array[j] = temp;
     72 	}
     73 
     74 }
     75 
  • 相关阅读:
    10_23自定义签发token,其他drf组件
    10_22频率认证和jwt
    10_21 三大认证
    vue2.0实现过滤
    windows下零基础gulp构建
    vue1.0+vue2.0实现选项卡
    数组去重方法
    stop()在animate中的用法
    两边固定,中间自适应
    JS获取宽度高度大集合
  • 原文地址:https://www.cnblogs.com/justlove/p/6985220.html
Copyright © 2020-2023  润新知