您的位置:

排序算法之快速排序java实现(java实现各种排序算法)

本文目录一览:

那位大大能详细的讲解一下JAVA中的快速排序

快速排序是对冒泡排序的一种改进。它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。最坏情况的时间复杂度为O(n2),最好情况时间复杂度为O(nlog2n)。

另外 java没指针概念 可以认为是句柄

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

1)、设置两个变量I、J,排序开始的时候I:=1,J:=N;

2)以第一个数组元素作为关键数据,赋值给X,即X:=A[1];

3)、从J开始向前搜索,即由后开始向前搜索(J:=J-1),找到第一个小于X的值,两者交换;

4)、从I开始向后搜索,即由前开始向后搜索(I:=I+1),找到第一个大于X的值,两者交换;

5)、重复第3、4步,直到I=J;

例如:待排序的数组A的值分别是:(初始关键数据X:=49)

A[1] A[2] A[3] A[4] A[5] A[6] A[7]:

49 38 65 97 76 13 27

进行第一次交换后: 27 38 65 97 76 13 49

( 按照算法的第三步从后面开始找)

进行第二次交换后: 27 38 49 97 76 13 65

( 按照算法的第四步从前面开始找X的值,6549,两者交换,此时I:=3 )

进行第三次交换后: 27 38 13 97 76 49 65

( 按照算法的第五步将又一次执行算法的第三步从后开始找)

进行第四次交换后: 27 38 13 49 76 97 65

( 按照算法的第四步从前面开始找大于X的值,9749,两者交换,此时J:=4 )

此时再执行第三步的时候就发现I=J,从而结束一躺快速排序,那么经过一躺快速排序之后的结果是:27 38 13 49 76 97 65,即所以大于49的数全部在49的后面,所以小于49的数全部在49的前面。

快速排序就是递归调用此过程——在以49为中点分割这个数据序列,分别对前面一部分和后面一部分进行类似的快速排序,从而完成全部数据序列的快速排序,最后把此数据序列变成一个有序的序列,根据这种思想对于上述数组A的快速排序的全过程如图6所示:

初始状态 {49 38 65 97 76 13 27}

进行一次快速排序之后划分为 {27 38 13} 49 {76 97 65}

分别对前后两部分进行快速排序 {13} 27 {38}

结束 结束 {49 65} 76 {97}

49 {65} 结束

结束//下面是一个示例,哪位给说说快速排序法的原理,下面的示例中指针和上下标移动我看不太懂,

public class QuickSort {

/**主方法*/

public static void main(String[] args) {

//声明数组

int[] nums = {27, 8, 57, 9, 23, 41, 65, 19, 0, 1, 2, 4, 5};

//应用快速排序方法

quickSort(nums, 0, nums.length-1);

//显示排序后的数组

for(int i = 0; i nums.length; ++i) {

System.out.print(nums[i] + ",");

}

System.out.println("");

}

/**快速排序方法*/

public static void quickSort(int[] a, int lo0, int hi0) {

int lo = lo0;

int hi = hi0;

if (lo = hi)

return;

//确定指针方向的逻辑变量

boolean transfer=true;

while (lo != hi) {

if (a[lo] a[hi]) {

//交换数字

int temp = a[lo];

a[lo] = a[hi];

a[hi] = temp;

//决定下标移动,还是上标移动

transfer = (transfer == true) ? false : true;

}

//将指针向前或者向后移动

if(transfer)

hi--;

else

lo++;

//显示每一次指针移动的数组数字的变化

/*for(int i = 0; i a.length; ++i) {

System.out.print(a[i] + ",");

}

System.out.print(" (lo,hi) = " + "(" + lo + "," + hi + ")");

System.out.println("");*/

}

//将数组分开两半,确定每个数字的正确位置

lo--;

hi++;

quickSort(a, lo0, lo);

quickSort(a, hi, hi0);

}

}

Java数组排序 几种排序方法详细一点

JAVA中在运用数组进行排序功能时,一般有四种方法:快速排序法、冒泡法、选择排序法、插入排序法。

快速排序法主要是运用了Arrays中的一个方法Arrays.sort()实现。

冒泡法是运用遍历数组进行比较,通过不断的比较将最小值或者最大值一个一个的遍历出来。

选择排序法是将数组的第一个数据作为最大或者最小的值,然后通过比较循环,输出有序的数组。

插入排序是选择一个数组中的数据,通过不断的插入比较最后进行排序。下面我就将他们的实现方法一一详解供大家参考。

1利用Arrays带有的排序方法快速排序

public class Test2{   

        public static void main(String[] args){   

                int[] a={5,4,2,4,9,1};   

                Arrays.sort(a);  //进行排序   

                for(int i: a){   

                        System.out.print(i);   

               }  

        }  

}

2冒泡排序算法

public static int[] bubbleSort(int[] args){//冒泡排序算法   

        for(int i=0;iargs.length-1;i++){   

               for(int j=i+1;jargs.length;j++){   

                   if (args[i]args[j]){   

                       int temp=args[i];   

                       args[i]=args[j];   

                       args[j]=temp;   

                       }   

            }  

       }  

       return args;  

}

3选择排序算法

public static int[] selectSort(int[] args){//选择排序算法   

         for (int i=0;iargs.length-1 ;i++ ){   

                int min=i;   

                for (int j=i+1;jargs.length ;j++ ){   

                      if (args[min]args[j]){   

                           min=j;   

                           }   

                  }   

                      if (min!=i){  

                      int temp=args[i];  

                      args[i]=args[min];  

                      args[min]=temp;          

                  }  

            }  

             return args;  

    }

4插入排序算法

public static int[] insertSort(int[] args){//插入排序算法   

                 for(int i=1;iargs.length;i++){   

                         for(int j=i;j0;j--){   

                                 if (args[j]args[j-1]){   

                                         int temp=args[j-1];  

                                         args[j-1]=args[j];  

                                        args[j]=temp;          

                                }else break;   

                        }  

                 }  

                 return args;  

         }

怎么用java实现快速排序

package com.xinhua.test2;

public class Student {

int sno;

String name;

double chiness;

double math;

double english;

double three_sco;

double all_s;

public Student(int sno, String name, double chiness, double math, double english, double three_sco) {

this.sno = sno;

this.name = name;

this.chiness = chiness;

this.math = math;

this.english = english;

this.three_sco = three_sco;

}

@Override

public String toString() {

return "学号:" + sno + ", 名字:" + name + ", 语文成绩:" + chiness + ", 数学成绩:" + math + ", 英语成绩:"

+ english + "总成绩:"+(chiness+math+english+three_sco);

}

public static void main(String[] args) {

Student A=new Student(1, "张三", 118, 145, 114.5, 198);

Student B=new Student(2, "李四", 130,110.5,100,210);

Student C=new Student(3, "王五",142.5,120,87.5,245.5);

System.out.println("学生列表信息为:");

System.out.println(A.toString());

System.out.println(B.toString());

System.out.println(C.toString());

//

double a_scoAll=A.chiness+A.math+A.english+A.three_sco;

A.all_s=a_scoAll;

double b_scoAll=B.chiness+B.math+B.english+B.three_sco;

B.all_s=b_scoAll;

double c_sclAll=C.chiness+C.math+C.english+C.three_sco;

C.all_s=c_sclAll;

Student[] s_s={A,B,C};

System.out.println("按总成绩从大到小排序为");

Student temp;

for(int i=0;is_s.length;i++){

for(int j=1;js_s.length-i;j++){

if(s_s[j-1].all_s s_s[j].all_s){

temp=s_s[j-1] ;

s_s[j-1] =s_s[j];

s_s[j]=temp;

}

}

}

for(int i=0;is_s.length;i++){

System.out.println("第"+(i+1)+"名为:"+s_s[i].toString());

}

}

}

java中快速排序的算法举个例子

package person.test;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.Collections;

import java.util.List;

import java.util.Random;

/**

* class name: RapidSort

* description: Java快速排序法:数组和集合

* @author Jr

*

*/

public class RapidSort {

private Random ran = new Random(); // 声明一个全局变量ran,用来随机生成整数

/**

* method name: sortArray

* description: 对数组的快速排序,只能用于int[]类型的数组

* @return

*/

private void sortArray() {

int[] array = new int[10]; // 声明数组长度为10

for (int i = 0 ; i array.length; i++) {

array[i] = ran.nextInt(10) + 1; // 数组赋值

}

Arrays.sort(array);

System.out.println(Arrays.toString(array));

}

/**

* method name: sortList

* description: 对集合的快速排序,可以用于ListObject类型数组,

* 隐含意思就是对所有类型数组都适用

* @return

*/

private void sortList() {

ListInteger list = new ArrayListInteger();

for (int i = 0 ; i 10; i++) {

list.add(ran.nextInt(10) + 1); // 给集合赋10个值

}

Collections.sort(list);

System.out.println(list);

}

public static void main(String[] args) {

RapidSort rs = new RapidSort();

rs.sortArray();

rs.sortList();

}

}

请给出java几种排序方法

java常见的排序分为:

1 插入类排序

主要就是对于一个已经有序的序列中,插入一个新的记录。它包括:直接插入排序,折半插入排序和希尔排序

2 交换类排序

这类排序的核心就是每次比较都要“交换”,在每一趟排序都会两两发生一系列的“交换”排序,但是每一趟排序都会让一个记录排序到它的最终位置上。它包括:起泡排序,快速排序

3 选择类排序

每一趟排序都从一系列数据中选择一个最大或最小的记录,将它放置到第一个或最后一个为位置交换,只有在选择后才交换,比起交换类排序,减少了交换记录的时间。属于它的排序:简单选择排序,堆排序

4 归并类排序

将两个或两个以上的有序序列合并成一个新的序列

5 基数排序

主要基于多个关键字排序的。

下面针对上面所述的算法,讲解一些常用的java代码写的算法

二 插入类排序之直接插入排序

直接插入排序,一般对于已经有序的队列排序效果好。

基本思想:每趟将一个待排序的关键字按照大小插入到已经排序好的位置上。

算法思路,从后往前先找到要插入的位置,如果小于则就交换,将元素向后移动,将要插入数据插入该位置即可。时间复杂度为O(n2),空间复杂度为O(1)

package sort.algorithm;

public class DirectInsertSort {

public static void main(String[] args) {

// TODO Auto-generated method stub

int data[] = { 2, 6, 10, 3, 9, 80, 1, 16, 27, 20 };

int temp, j;

for (int i = 1; i data.length; i++) {

temp = data[i];

j = i - 1;

// 每次比较都是对于已经有序的

while (j = 0 data[j] temp) {

data[j + 1] = data[j];

j--;

}

data[j + 1] = temp;

}

// 输出排序好的数据

for (int k = 0; k data.length; k++) {

System.out.print(data[k] + " ");

}

}

}

三 插入类排序之折半插入排序(二分法排序)

条件:在一个已经有序的队列中,插入一个新的元素

折半插入排序记录的比较次数与初始序列无关

思想:折半插入就是首先将队列中取最小位置low和最大位置high,然后算出中间位置mid

将中间位置mid与待插入的数据data进行比较,

如果mid大于data,则就表示插入的数据在mid的左边,high=mid-1;

如果mid小于data,则就表示插入的数据在mid的右边,low=mid+1

最后整体进行右移操作。

时间复杂度O(n2),空间复杂度O(1)

package sort.algorithm;

//折半插入排序

public class HalfInsertSort {

public static void main(String[] args) {

int data[] = { 2, 6, 10, 3, 9, 80, 1, 16, 27, 20 };

// 存放临时要插入的元素数据

int temp;

int low, mid, high;

for (int i = 1; i data.length; i++) {

temp = data[i];

// 在待插入排序的序号之前进行折半插入

low = 0;

high = i - 1;

while (low = high) {

mid = (low + high) / 2;

if (temp data[mid])

high = mid - 1;

else

// low=high的时候也就是找到了要插入的位置,

// 此时进入循环中,将low加1,则就是要插入的位置了

low = mid + 1;

}

// 找到了要插入的位置,从该位置一直到插入数据的位置之间数据向后移动

for (int j = i; j = low + 1; j--)

data[j] = data[j - 1];

// low已经代表了要插入的位置了

data[low] = temp;

}

for (int k = 0; k data.length; k++) {

System.out.print(data[k] + " ");

}

}

}

四 插入类排序之希尔排序

希尔排序,也叫缩小增量排序,目的就是尽可能的减少交换次数,每一个组内最后都是有序的。

将待续按照某一种规则分为几个子序列,不断缩小规则,最后用一个直接插入排序合成

空间复杂度为O(1),时间复杂度为O(nlog2n)

算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。当增量减到1时,进行直接插入排序后,排序完成。

package sort.algorithm;

public class ShellSort {

public static void main(String[] args) {

int a[] = { 1, 54, 6, 3, 78, 34, 12, 45, 56, 100 };

double d1 = a.length;

int temp = 0;

while (true)

{

//利用这个在将组内倍数减小

//这里依次为5,3,2,1

d1 = Math.ceil(d1 / 2);

//d为增量每个分组之间索引的增量

int d = (int) d1;

//每个分组内部排序

for (int x = 0; x d; x++)

{

//组内利用直接插入排序

for (int i = x + d; i a.length; i += d) {

int j = i - d;

temp = a[i];

for (; j = 0 temp a[j]; j -= d) {

a[j + d] = a[j];

}

a[j + d] = temp;

}

}

if (d == 1)

break;

}

for (int i = 0; i a.length; i++)

System.out.print(a[i]+" ");

}

}

五 交换类排序之冒泡排序

交换类排序核心就是每次比较都要进行交换

冒泡排序:是一种交换排序

每一趟比较相邻的元素,较若大小不同则就会发生交换,每一趟排序都能将一个元素放到它最终的位置!每一趟就进行比较。

时间复杂度O(n2),空间复杂度O(1)

package sort.algorithm;

//冒泡排序:是一种交换排序

public class BubbleSort {

// 按照递增顺序排序

public static void main(String[] args) {

// TODO Auto-generated method stub

int data[] = { 2, 6, 10, 3, 9, 80, 1, 16, 27, 20, 13, 100, 37, 16 };

int temp = 0;

// 排序的比较趟数,每一趟都会将剩余最大数放在最后面

for (int i = 0; i data.length - 1; i++) {

// 每一趟从开始进行比较,将该元素与其余的元素进行比较

for (int j = 0; j data.length - 1; j++) {

if (data[j] data[j + 1]) {

temp = data[j];

data[j] = data[j + 1];

data[j + 1] = temp;

}

}

}

for (int i = 0; i data.length; i++)

System.out.print(data[i] + " ");

}

}

用JAVA实现快速排序算法?

本人特地给你编的代码

亲测

public class QuickSort {

public static int Partition(int a[],int p,int r){

int x=a[r-1];

int i=p-1;

int temp;

for(int j=p;j=r-1;j++){

if(a[j-1]=x){

// swap(a[j-1],a[i-1]);

i++;

temp=a[j-1];

a[j-1]=a[i-1];

a[i-1]=temp;

}

}

//swap(a[r-1,a[i+1-1]);

temp=a[r-1];

a[r-1]=a[i+1-1];

a[i+1-1]=temp;

return i+1;

}

public static void QuickSort(int a[],int p,int r){

if(pr){

int q=Partition(a,p,r);

QuickSort(a,p,q-1);

QuickSort(a,q+1,r);

}

}

public static void main(String[] stra){

int a[]={23,53,77,36,84,76,93,13,45,23};

QuickSort(a,1,10);

for (int i=1;i=10;i++)

System.out.println(a[i-1]);

}

}