快速排序

本文详细介绍了快速排序的基本思路和步骤,包括选择分界值、分区过程以及递归排序两部分。通过实例展示了如何将序列分为左右两部分,并对每一部分再次进行快速排序,最终达到整个序列有序的目的。提供的Java代码实现展示了快速排序算法的完整过程。
摘要由CSDN通过智能技术生成

基本思路:从待排得数据序列中任取一个数据(如第一个数据)作为分界值,所有比它小的数据元素一律放到左边,所有比他大的数据元素一律放到右边,这样经过一趟下来,该序列形成左右两个子序列,左边序列中数据元素的值都比分界值小,右边序列中数据元素的值都比分界值大。
一趟快速排序的算法是:
第一步:设置两个变量i、j,排序开始的时候i=0, j=N(数组的最大索引号) ;
第二步:以第一个数组元素作为关键数据,赋值给X,即X=A [0] ;
第三步:从j开始向前搜索,即由后开始向前搜索(j=j-1) ,找到第一个小于X的值,两者交换;
第四步:从i开始向后搜索,即由前开始向后搜索(i=i+1) ,找到第一个大于 X的值,两者交换;
第五步:重复第3、4步,直到i=j;
实例讲解
例如:升序(前小后大)
待排序的数组A的值分别是: ( 初始关键数据X: =49 (将数组分为两部分之前,x值不变) )
A[0] A[1] A[2] A[3] A[4]A[5] A[6]:
49
38
65
97
76
13
27
1、进行如上所说的第三步:由后向前搜索j= j-1=6, 用x=49与A[6]比较,
A[0] A[1] A[2] A[3] A[4] A[5] A[6]:
49
38
65
97
76
13
27
j=j-1=6
X
x大于A[6],交换位置所有比它小的数据元素律放到左边, 所有势,
他大的数据元素一律放到右边,
进行第次交换后:
27
38
65
97
76
13
49
2、进行如上所说的第四步:由前向后搜索 i=i+1=1,也就是用x=49与A[1]比较,
A[6] A[5] A[0] A[1] A[2] A[3] A[4]
i=i+1,A[1]小于x,所以不变,所有比它小的数据元素一律放到左边,所有比他大的数据元素一律放到右边,继续由前向后搜索i= i+1=3,也就是x=49与A[3]比较
A[3]
A[5]
A[6]
A[2]
A[4]
A[1]
A[0]
。。。。。
因此,整体思路是:
初始化状态
[49
38
65
97
76
13
27]


第一次排序后,进行一次划分为
[27
38
13 ]
49
[76
97
65]

分别对前后两部分进行再一次快速排序
[13]
27
[38]


[ 65]
76
[97 ]
结束之后就为
●13, 27, 38, 49, 65, 76, 97,

package start;

public class G {
    //快排

   public static void quicksort(int []data,int start,int end)
   {
       int i=start;//左索引
       int j=end;//右索引
       if(i>=j) return;;//到中间,退出递归

       boolean flag=true;//标志位,为真时为从右>左比较,为假时相反
       while (i!=j){//还有没被比完的元素
           if(data[i]>data[j]){//交换元素
               int tmp=data[i];
               data[i]=data[j];
               data[j]=tmp;
               flag=!flag;//变为与原来相反的数
           }

           if(flag){
               j--;
           }
           else {
               i++;
           }
       }
       i--;
       j++;//为下次的小快排做准备(递归),到中间了,往回走

       quicksort(data,0,i);
       quicksort(data,j,end);
   }

    public static void main(String[] args){

        int []a={26,33,45,23,90,13,68};
        quicksort(a,0,a.length-1);
        for(int i: a){
            System.out.print(i+" ");
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值