美文网首页
数组和单链表的快速排序(JAVA)

数组和单链表的快速排序(JAVA)

作者: Bamboooooo_Yoo | 来源:发表于2018-08-09 17:09 被阅读0次
数组实现

枢纽值的选取用的是三数选一法,即在首、尾、中间位置的三个数中选择数值位于中间的那一个数。

public class QuickSort {
    public static int partition(int []num,int left,int right){
        //三数取中
        int mid = left + (right-left)/2;//
        if(num[mid] > num[right]){
            swap(num[mid], num[right]);
        }
        if(num[left] > num[right]){
            swap(num[left], num[right]);
        }
        if(num[mid] > num[left]){
            swap(num[mid], num[left]);
        }
        int base = num[left];//此处保证在left处存储的是三个数中处于中间的数 
        while(left < right){
            while(num[right] >= base && right > left){//找到从右起下一个比base小的值
                right--; 
            }
            num[left] = num[right];
            while(num[left] <= base && right > left){//找到从左起下一个比base大的值
                left++;
            }
            num[right] = num[left];
        }
        num[right] = base;//定下base值应在的位置
        return right;
    }
    //递归实现快排
    public void quickSort(int num[],int left,int right){
        if(left < right) {
            int index=partition(num,left,right); //将数组分区,获得base值所在的位置
            quickSort(num,left,index-1); //搜索左边的子数组
            quickSort(num,index+1,right);  //搜索右边的子数组
        }
    }
    public static void swap(int a,int b){
        int temp=a;
        a=b;
        b=temp;
    }   
}
单链表实现

用三个指针来控制,pBase指针指向枢纽值结点,pleft指针指向当前最后一个比枢纽值小的结点,pright结点用于遍历,将遇到的比pBase小的结点的值交换到前面去。


public class QuickSortList {
    public void quickSort(LNode head, LNode tail) {
        if(head == null || head == tail)
            return ;
        LNode pBase = head;//作为枢纽值的结点
        LNode pleft = pBase;//指向当前最后一个比枢纽值小的结点,pBase与pleft之间的结点值始终都比枢纽值小,
        LNode pright = pBase.next;//指向比枢纽值大的结点
        int temp;
        while(pright != tail) {
            //作为遍历的pright指针,此时当pright找到了下一个比基准值小的结点,就把pleft右移,将pright的值与pleft交换
            if(pright.val < pBase.val) {
                pleft = pleft.next;//移向下一个存储小值的位置
                if(pright != pleft) {
                    temp = pleft.val;
                    pleft.val = pright.val;
                    pright.val = temp;
                }           
            }
            pright = pright.next;
        }
        temp = pBase.val;
        pBase.val = pleft.val;
        pleft.val = temp;//原pleft的下一个结点就比枢纽值大
        
        quickSort(pBase, pleft);
        quickSort(pleft.next, tail);
    }
    
}

相关文章

  • 数组和单链表的快速排序(JAVA)

    数组实现 枢纽值的选取用的是三数选一法,即在首、尾、中间位置的三个数中选择数值位于中间的那一个数。 单链表实现 用...

  • 算法笔记 - 数组与单链表快速排序(Java)

    数组快速排序 单链表快速排序 本文为作者kMacro原创,转载请注明来源:http://www.jianshu.c...

  • 单链表快排

    单链表快速排序 - Jensen抹茶喵 - 博客园 图 单链表的快速排序 - CSDN博客

  • 单链表快速排序

    单链表快速排序和数组的快速排序差不多。选一个枢轴然后进行一次划分把数字交换到枢轴的两边。这个过程需要交换,链表的交...

  • 常见简单算法

    1.数组 二分查找: 冒泡排序 插入排序 选择排序 快速排序 链表 链表反转 合并2个有序链表 树 前序遍历

  • java单链表排序

    在线手写 java单链表排序 单链表每个节点为: 如果一个单链表为2->1->3->5->4,经过排序后链表结构为...

  • 算法小专栏:选择排序

    本篇将重点介绍选择排序,在讲解选择排序之前,我们先复习一下数组和链表等知识。 一、数组 or 链表? 数组和链表作...

  • 数据结构必备代码

    目录: 排序算法 树的遍历 查找 链表插入 数组与列表转化 二维数组排序 java中输入 集合遍历 一、基本排序1...

  • 有关算法的面试题收集

    1. 对单链表排序,用代码实现【腾讯】 2. 快速找到未知长度的单链表的中间节点【腾讯】 普通方法:遍历一遍单链表...

  • 简单的数据结构

    1. 数组 array 所谓数组,是有序的元素序列 2. 链表 list 属于线性表, 分为单链表和双链表,单链表...

网友评论

      本文标题:数组和单链表的快速排序(JAVA)

      本文链接:https://www.haomeiwen.com/subject/ychcbftx.html