A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

能不能帮我写一个快速排序 数据的例子?我看过一些其他的例子,感觉好乱啊。谁有思路比较清晰一点的例子啊!

8 个回复

倒序浏览
冒泡排序:相邻两个元素比较,

public static void main(String[] args)
{
                int[] arr={57,23,19,89,66,74};
  for(int x=0; x<arr.length-1; x++)
  {
   for(int y=0; y<arr.length-1-x; y++)
   {
    if(arr[y]>arr[y+1])
    {
     int temp = arr[y];
     arr[y] = arr[y+1];
     arr[y+1] = temp;
     swap(arr,y,y+1);
    }
   }
  }
               for(int x=0; x<arr.length-1; x++)
               {
                     System.out.println(arr[x]);
               }

}

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
冒泡排序,是相邻两个元素比较。
快速排序,主要是递归的思想,不断的将许多数据分成许多部分,通过不断选取中间元素和两边的元素进行比较。
既然是排序,肯定牵扯到元素之间的比较,不知你所说的在冒泡排序的基础上改进,是看重哪一方面。
当然,事物之间有相互联系是肯定的,排序之间当然也有共通之处。
我倒是感觉冒泡排序和选择排序很像。

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
没看懂你的意思,如果你是想要知道高效的排序方式,插入排序倒是挺高效的,以下是我写的插入排序        public static void insertSort(int[] arr)
        {
                for (int x =1;x<arr.length ;x++ )
                {
                        int temp = arr[x];//定义一个临时变量去接收每次需要比较的数据
                        int y = x-1;                //定义一个变量,记录前一个角标位。
                        while (temp<arr[y])        //开始比较,这是升序排序,如果要降序,可以把"<"改成">"
                        {
                                arr[y+1]=arr[y];        //如果这个数比前一个小,那么前一个数的角标位后移。
                                y--;                        //比较后,y--,意为再和前一位角标去比

                                if (y==-1)                //如果y自减到-1,结束本次比较
                                {
                                        break;
                                }
                        }
                        arr[y+1]=temp;//此时y自减的数字的后一位则是temp应该在的位置
                }
        }

评分

参与人数 1技术分 +1 收起 理由
田向向 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 郑正华 于 2012-7-30 21:00 编辑

快速排序是对冒泡排序的一种改进,它的基本思想就是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据要小,然后再按此方法对两部分数据分别进行快速排序,整个排序过程可以递归进行。这个概念什么的你可以参考下百度百科~~
在这里我给你举个例子说下一趟排序算法,给你点思路,
int arr[] = {5,2,8,6,7,52,4,11};
1,设置两个变量,i = 0 ;j = arr.length-1;
2,把第一个数组元素5作为关键数据赋值给k,即k =arr[0];
3,从数组的最后一个元素开始向前搜索,j--,找到第一个小于k的值arr[j],然后arr[j]和arr交换,
数组变为:4   2   8   6   7   52   5   11
4,从数组第一个元素开始向后搜索,i++,找到第一个大于k的值arr,并做交换处理,就是arr和arr[j]交换;
数组变为:4   2   5   6   7   52   8   11
5,重复3,4,5步骤,直到 i = j,注意关键数据k值永远不变就行。经过一趟快速排序后你就会发现关键值k的左边都比k小,k的右边的数值都比k要大。
具体代码我也没时间写啦,给你提供一个网址,这上面有个例子,就是下面的代码,你不妨试试,研究研究:
http://www.oschina.net/code/snippet_186712_6364
  1. public class QSort
  2. {

  3.         /**
  4.          * @param args
  5.          */
  6.         public static void main(String[] args)
  7.         {
  8.                 // TODO 自动生成方法存根
  9.                 quicksort qs = new quicksort();
  10.                 int data[] = {44,22,2,32,54,22,88,77,99,11};
  11.                 qs.data = data;
  12.                 qs.sort(0, qs.data.length-1);
  13.                 qs.display();
  14.         }

  15. }


  16. class quicksort
  17. {
  18.         public int data[];
  19.         
  20.         private int partition(int sortArray[],int low,int hight)
  21.         {
  22.                 int key = sortArray[low];
  23.                
  24.                 while(low<hight)
  25.                 {
  26.                         while(low<hight && sortArray[hight]>=key)
  27.                                 hight--;
  28.                         sortArray[low] = sortArray[hight];
  29.                         
  30.                         while(low<hight && sortArray[low]<=key)
  31.                                 low++;
  32.                         sortArray[hight] = sortArray[low];
  33.                 }
  34.                 sortArray[low] = key;
  35.                 return low;
  36.         }
  37.         
  38.         public void sort(int low,int hight)
  39.         {
  40.                 if(low<hight)
  41.                 {
  42.                         int result = partition(data,low,hight);
  43.                         sort(low,result-1);
  44.                         sort(result+1,hight);
  45.                 }
  46.                
  47.         }
  48.         
  49.         public void display()
  50.         {
  51.                 for(int i=0;i<data.length;i++)
  52.                 {
  53.                         System.out.print(data[i]);
  54.                         System.out.print(" ");
  55.                 }
  56.         }
  57. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
田向向 + 1 赞一个!

查看全部评分

回复 使用道具 举报
毕老师讲了一个很好的方法,可以很好的区分选择排序跟冒泡排序,我回来总结了一下,又加上了一些思路,这主要就是思路。可以使用打印倒三角形的方法来记住这两种排序
思路:大圈套小圈的思想。通过排序分析后,会发现,就是和这个原理很像。
我很想发一张图片上来,但是就是发不了,很纠结,那好吧,只能把代码发到下面了,里面有思路:
———————————————————————————————————————————————————————————————————
**************************************************************************************************************************
1、使用选择排序法对数组进行排序?????????????????
**************************************************************************************************************************
//选择排序
   
  /*思路:1.明确最终结果是是什么。最终结果是对一个数组进行排序,他们都是整型的int类型的。
                2.明确未知变量,数组中的下角标比较未知,这两个数字都是未知的*/

    public static void selectSort(int [] arr)
        {
                for (int x=0;x<arr.length-1 ; x++)
                {
                        for(int y=x+1;y<arr.length;y++)
                        {
                                if (arr[x]>arr[y]) //假如把这个>号换个方向,那么它的排序后的顺序就换了。
                                {
                                        swap(arr,x,y);
                                }
                        }
                }
        }


/*定义一个输出语句*/

public static void sop(String str)
        {
                System.out.println(str);
        }


/*对数组中的位置进行置换*/

public static void swap(int []arr,int a,int b)
        {
                int temp=arr[a];
                arr[a]=arr[b];
                arr[b]=temp;

        }



/*定义一个功能先对函数进行遍历,先输出原始函数,然后再输出排序后的函数*/
public static void printArry(int [] arr)
        {
                for (int x=0;x<arr.length ;x++ )
                {
                        if (x!=arr.length-1)
                        System.out.print(arr[x]+".");
                        else
                        System.out.println(arr[x]);
                }
                       
        }

**************************************************************************************************************************
2.使用冒泡排序法对数组进行排序?????????????????
**************************************************************************************************************************

主函数调用如下:
int [] arr={36,23,55,65,23,45,65,32};
                sop("排序前");
                printArry(arr);
                sop("排序后");
                bubbleSort(arr);
                printArry(arr);




程序如下:
public static void bubbleSort(int[] arr)
{
         for (int x=0;x<arr.length-1 ;x++ )
        {
                for (int y=0;y<arr.length-1-x ;y++ )
                {
                        if (arr[y]<arr[y+1])
                        {
                                swap(arr,y,y+1);
                        }
                       
                }
        }
}
**************************************************************************************************************************
3.对数组中的元素进行反转?????????????????
**************************************************************************************************************************

/*
        对给定的数组中的元素进行反转。
                {6,9,12,44,21};-->
                {21,44,12,9,6};

        思路:
        1,反转其实就是头尾角标的元素进行位置的置换。
        2,然后让头角标自增,尾角标自减,在继续位置转换。
        3,依次类推,知道头角标和尾角标相等时大于就结束。
        */
程序如下:
                public static void reverseArry(int[] arr)
                {
                        for (int start=0,end=arr.length-1 ;start<end; start++,end--)
                        {
                                swap(arr,star,end);
                        }

                }

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
毕老师的那两个我就不说了,我想了一个自己的思路,你可以参考一下
我的排序方法:
原理:让参与外循环元素的头角标元素和最值元素调换位置。
内循环一次,得到最值角标,与参与外循环的头角标元素调换位置。最值出现参与循环的元素的头角标位置上。
注意:m这个变量存储参与外循环的元素中最值的角标。这个值的初始化值随着a改变,a为去跟其余元素最值调换位置的元素角标,b为跟最值比大小的元素角标。m为最值角标。
好处:内循环每次循环,满足条件在栈内存中进行交换(角标交换),堆内存中不变(数组的值)。
内循环结束,才在堆内存中交换(数组元素位置置换)。这样在栈内存中交换,适当的会节省内存。
*/

        public static void arr_sort3(int[]x)
        {
                for (int a=0;a<x.length ;a++ )
                {        int m=a;//m这个变量存储参与外循环的元素中最值的角标。这个值初始化值随着a改变
                        {        for (int b=a+1;b<x.length;b++ )//内循环一次,得出参与循环的最值元素角标
                                        if (x[m]>x[b])
                                        m=b;
                        }
                        int tmp=x[m];//将最值元素与参与循环的头角标元素调换位置。
                        x[m]=x[a];
                        x[a]=tmp;
                        System.out.println(x[a]);//调换位置以后,打印头角标元素即最值。
                }
        }



}

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
王峰 中级黑马 2012-7-31 00:00:34
8#
冒泡排序是一种典型的交换排序方法,其思想是让无序的相邻的关键字比较交换,使最小的如气泡浮上来,快速排序是有冒泡排序改进而来的,:冒泡排序的算法如:
int [] temp = {1,2,56,23,89,5};
for (int i = 0; i <temp.length-1; i ++){
for(int j = temp.length - 1;j > i; j --){
if( temp[j]<temp[j-1]){
int tt = temp[j];
temp[j]=temp[j-1];
temp[j-1]=tt;
}
}
快速排序算法:
int i=0;
int j=temp.length;
if(i<j){
int tt = temp[i];
while(i!=j){
    while(j>i&&temp[j]<tt)
   j---;
  temp[i]=temp[j];
while(i<j&&temp[i]<tt)
i--;
temp[j]=temp[i];
}
temp[i]=tt;
//然后递归调用这一段代码即可,分前半段 和后半段,瞌睡的很,我睡觉了,晚安,有点乱,希望对你有帮助

}
}
回复 使用道具 举报
冒泡排序:
冒泡排序:不断遍历文件,交换倒序的相邻元素,直到文件排好顺序。
冒泡排序的主要优点是容易实现,冒泡排序通常会比其他排序慢。

  1. public class Bubble {

  2.     public int[] array = {8,2,4,7,0,1};

  3.     private void sort(){
  4.   <FONT color=yellowgreen>/*
  5.      当i=0时进入第一轮外层循环将第一个元素8依次与后面五个元素比较,若比后面元素大则交换位置,经过第一轮循环后,将最小的元素0换在第一个位置。
  6.                  {8,2,4,7,0,1}==》{2,8,4,7,0,1}==》{0,8,4,7,2,1}
  7.      当i=1时进入第二轮循环将第二个元素8依次与后面四个元素比较,若比后面元素大则交换位置,经过第一轮循环后,将次小的元素1换在第二个位置。
  8.                  {0,8,4,7,2,1}==》{0,4,8,7,2,1}==》{0,2,8,7,4,1}==>{0,1,8,7,4,2}
  9.      当i=2时进入第三轮循环将第三个元素8依次与后面三个元素比较,若比后面元素大则交换位置,经过第一轮循环后,将第三小的元素2换在第三个位置。
  10.                  {0,1,8,7,4,2}==》{0,1,7,8,4,2}==》{0,1,4,8,7,2}==>{0,1,2,8,7,4}
  11.      当i=3时进入第四轮循环将第四个元素8依次与后面两个元素比较,若比后面元素大则交换位置,经过第一轮循环后,将第四小的元素4换在第四个位置。
  12.                  {0,1,2,8,7,4}==》{0,1,2,7,8,4}==》{0,1,2,4,8,7}
  13.      当i=4时进入第五轮循环将第五个元素8依次与最后一个元素比较,若比后面元素大则交换位置,经过第一轮循环后,将第五小的元素7换在第五个位置。
  14.                  {0,1,2,4,8,7}==》{0,1,2,4,7,8}
  15.      当i=5时候,不满足i<array.length-1,退出外层循环比较结束。
  16.    */</FONT>
  17.         for(int i = 0 ; i < array.length-1 ; i ++){
  18.        <FONT color=yellowgreen> /*当i=0时,内层循环数据交换情况
  19.                        当j=1时,a[i]=a[0]=8,a[j]=a[1]=2,此时a[0]>a[j]需要交换位置,数组的次序变为{2,8,4,7,0,1},j自增一次变为2
  20.                        当j=2时,a[i]=a[0]=2,a[j]=a[2]=4,此时a[0]<a[j]保持原顺序,数组的次序仍为{2,8,4,7,0,1},j自增一次变为3
  21.                        当j=3时,a[i]=a[0]=2,a[j]=a[3]=7,此时a[0]<a[j]保持原顺序,数组的次序仍为{2,8,4,7,0,1},j自增一次变为4
  22.                        当j=4时,a[i]=a[0]=2,a[j]=a[4]=0,此时a[0]>a[j]需要交换位置,数组的次序仍为{0,8,4,7,2,1},j自增一次变为5
  23.                        当j=3时,a[i]=a[0]=0,a[j]=a[5]=1,此时a[0]<a[j]保持原顺序,数组的次序仍为{0,8,4,7,2,1},j自增一次变为6
  24.                        当j=6=array.length时候不满足内层循环条件跳出内层循环,i自增一次变为1,进入外层循环,内层循环共执行array.lenght-1次
  25.         */</FONT>
  26.             for(int j = i + 1 ; j < array.length ; j ++){
  27.             if(array[i] > array[j])
  28.             swap(array , i , j);
  29.             }
  30.         }
  31.         display(array);
  32.     }

  33.     private void display(int [] a){
  34.         for(int i : a)
  35.         System.out.print(i + "\t");
  36.    }

  37.     private void swap(int [] a , int bigger , int smaller){
  38.         int temp;
  39.         temp = a[bigger];
  40.         a[bigger] = a[smaller];
  41.         a[smaller] = temp;
  42.    }

  43.     public static void main(String[] args) {
  44.         Bubble b = new Bubble();
  45.         b.sort();
  46.     }
  47. }
复制代码
快速排序:
快速排序是对冒泡排序的一种改进。原理可以参照http://blog.csdn.net/sws9999/article/details/2791812
  1. public class QuickSort {

  2.      public int[] array = {8,2,4,7,0,1};
  3.      protected void display(int [] a){
  4.          for(int i : a)
  5.          System.out.print(i + "\t");
  6.      }
  7.      protected void swap(int [] a , int bigger , int smaller){
  8.          int temp;
  9.          temp = a[bigger];
  10.          a[bigger] = a[smaller];
  11.          a[smaller] = temp;
  12. }
  13. <FONT color=yellowgreen>/**
  14. *
  15. * 对三点进行排序
  16. *
  17. * @param a
  18. * @param first
  19. * @param mid
  20. * @param last
  21. */</FONT>
  22.     private void sortPivots(int [] a , int first , int mid , int last){
  23.         sortForTwo(a, first, mid);
  24.         sortForTwo(a , mid , last);
  25.         sortForTwo(a, first, mid);
  26.     }

  27.     private void sortForTwo(int [] a , int before , int after){
  28.         if(a[before] > a[after]){
  29.             swap(a, before, after);
  30.        }
  31.    }

  32.     private int partition(int [] a, int first , int last){
  33.        <FONT color=yellowgreen>//设置支点</FONT>
  34.         int mid = (first + last)/2;
  35.         sortPivots(a, first, mid, last);
  36.      <FONT color=yellowgreen>  //将支点移动到数组中的倒数第二个位置</FONT>
  37.         swap(a, mid, last - 1);
  38.         int pivotIndex = last - 1;
  39.         int pivot = a[pivotIndex];
  40.        <FONT color=yellowgreen>//确定子数组
  41. </FONT>        int indexFromLeft = first + 1;
  42.         int indexFromRight = last - 2;
  43.         boolean done = false;
  44.         while(!done){
  45.             <FONT color=yellowgreen>//从数组的左边开始,留下小于支点的元素</FONT>
  46.             while(a[indexFromLeft] < pivot)
  47.             indexFromLeft++;
  48.             <FONT color=yellowgreen>//从数组的右边开始,留下大于支点的元素
  49. </FONT>           while(a[indexFromRight] > pivot)
  50.                 indexFromRight--;
  51.            <FONT color=yellowgreen>//交换数据
  52. </FONT>           if(indexFromLeft < indexFromRight){
  53.                swap(a, indexFromLeft, indexFromRight);
  54.                indexFromLeft ++;
  55.                indexFromRight--;
  56.            }else
  57.                done = true;
  58.        }
  59.       <FONT color=yellowgreen> //将支点放在较小部分和较大部分字数组之间
  60. </FONT>       swap(a, pivotIndex, indexFromLeft);
  61.        pivotIndex = indexFromLeft;
  62.        return pivotIndex;
  63.     }

  64.     private int [] sort(int [] a , int first , int last){
  65.         if(last - first + 1 < 4){
  66.             <FONT color=yellowgreen>//选择别的排序
  67. </FONT>            for(int i = 0 ; i < a.length ; i ++){
  68.                 for(int j = i + 1 ; j < a.length ; j ++){
  69.                      if(a[i] > a[j])
  70.                           swap(a , i , j);
  71.                  }
  72.              }
  73.          }else{
  74.                   <FONT color=yellowgreen>//创建划分
  75. </FONT>                 int pivotIndex = partition(array, first, last);
  76.                  <FONT color=yellowgreen>//对较小部分和较大部分分别进行快速排序
  77. </FONT>                 sort(a, first, pivotIndex - 1);
  78.                  sort(a, pivotIndex + 1 , last);
  79.          }
  80.          return array;
  81.     }
  82.     public static void main(String[] args) {
  83.         QuickSort q = new QuickSort();
  84.         q.array = q.sort(q.array, 0 , q.array.length - 1);
  85.         q.display(q.array);
  86.     }
  87. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马