排序算法总结(三)——交换排序

1.冒泡排序
基本步骤:依次比较相邻两个元素的大小,如果a[i]>a[i+1],则进行交换;从第一对到最后一对,由此即可将最大元素放置到序列末尾。接着对n-1个元素重复上诉步骤;

改进:设置flag标志,如果在一轮循环结束后,没有出现元素交换,则表示该序列已经是排序好的,无需继续进行。

代码如下:

public class BubbleSort{

    public static void main(String[] args) {
        int[] a = {2,3,1,4,6,0};
        sort(a);
        for(int i = 0;i<a.length;i++)
            System.out.println(a[i]);
    }

    public static void sort(int[] a){
        int len = a.length;
        for(int i = 0;i<len;i++){
            boolean flag = true;
            for(int j = 0;j<len-i-1;j++){
                if(a[j]>a[j+1]){
                    int temp = a[j];
                    a[j] = a[j+1];
                    a[j+1] = temp;
                    flag = false;
                }
            }
        if(flag)
            break;
        }   
    }
}

2.快速排序
快速排序的基本思想:
首先从序列中选择一个数作为基准值,在第一轮排序后将序列分成两部分,前半部分的值都比基准值小,后半部分都比基准值大,然后对左右分区重复上诉步骤。整个排序过程可以递归进行,由此实现排序过程。

这篇博文描述的快速排序的过程https://www.cnblogs.com/MOBIN/p/4681369.html
博主将快速排序联想为“东拆西补或西拆东补,一边拆一边补”,直到所有元素达到有序的状态,我觉得很生动,帮助我理解快速排序的实现过程,所以进行了参考,侵权删。
我是把快速排序联想成东拆西补或西拆东补,一边拆一边补,直到所有元素达到有序状态。

算法步骤:
1.设置两个变量i,j作为指针,i指向最左边的元素,j指向最右边的元素;
2.这里将第一个元素a[t]作为基准值(一般选择a[0]);
3.首先将基准值复制到临时变量temp中,这样a[t]处即为空;
4.从j开始由右至左开始扫描,当遇到a[j]小于temp,则将补上a[t]处的空缺,此时a[j]处为空;
5.接着从i开始由左向右扫面,当遇到a[i]大于temp,则将补上a[j]处的空缺,此时a[i]处为空;
6.如此进行,直到j==j,那么temp放置到此处,则完成第一轮的排序;
7.使用递归思想,分别对左半区间和右半区间重复上诉过程。

代码实现如下:

public class QuickSort {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] a = {2,3,1,4,6,0};
        int len = a.length;
        sort(a,0,len-1);
        for(int i = 0;i<a.length;i++)
            System.out.println(a[i]);
    }

    public static void sort(int[] a, int left, int right){
        int temp = 0;//定义临时变量
        int l = left;//保存左指针
        int r = right;//保存右指针

        if(left<right){
            temp = a[left];
            while(left < right){
                while(left < right && a[right] >= temp){
                    right--;
                }

                a[left] = a[right];

                while(left < right && a[left] <= temp){
                    left ++;
                }

                a[right] = a[left];
            }

            a[left] = temp;

            sort(a, l,left-1);
            sort(a, left+1,r);
        }

    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值