第四天学习

常见数据结构

数据结构可视化网站:点击

  • 栈:栈可以把它想成是一个桶结构,只能从加入数据只能加到顶端,取数据时也只能从上面开始取,简单的说就是先进后出
  • 队列:可以把队列想成是一根两边都通的管道,但是队列的入口和出口完全固定,只能由一边进,从另一边出,简单的说就是先进先出
  • 链表:可以在链表的任意位置插入数据,也可以从任意位置取出,但是都要从头开始遍历列表,不能从中间位置开始遍历
  • 哈希表:哈希表有点类似于字典,与字典不同的是哈希表一个哈希值可以对应很多个映射值,具体解释参考:链接

快速排序

使用递归可方便的实现快速排序、下面是快速排序的原理

下面我们通过一个案例来演示一下快速排序的基本步骤: 以序列 46 30 82 90 56 17 95 15 共8个元素

    初始状态: 46 30 82 90 56 17 95 15 选择46 作为基准值,i = 0, j = 7

           i = 0 j = 7

       15 30 82 90 56 17 95 46 15 < 46, 交换 15 和 46,移动 i, i = 1

             i = 1 j = 7

          15 30 82 90 56 17 95 46 30 < 46, 不需要交换,移动 i , i = 2

               i = 2 j = 7

          15 30 46 90 56 17 95 82 82 > 46, 交换82 和 46,移动 j , j = 6

               i = 2 j = 6

           15 30 46 90 56 17 95 82 95 > 46, 不需要交换,移动 j , j = 5

               i = 2 j = 5

           15 30 17 90 56 46 95 82 17 < 46, 交换46 和 17,移动 i, i = 3

                 i = 3 j = 5

           15 30 17 46 56 90 95 82 90 > 46, 交换90 和 46,移动 j , j = 4

               3 = i j = 4

           15 30 17 46 56 90 95 82 56 > 46, 不需要交换,移动 j , j = 3

                i = j = 3   

    i = j = 3, 这样序列就这样分割成了两部分,左边部分{15, 30, 17} 均小于 基准值(46);右边部分 {56, 90,95,82},均大于基准值。这样子我们就达到了分割序列的目标。在接着对子序列用同样的办法进行分割,直至子序列不超过一个元素,那么排序结束,整个序列处于有序状态。

根据以上原理,使用java实现快速排序

class QuickSort{

    public static void main(String[] args){
        int[] a = {9,8,6,54,3,1,8,10,2,9,50,4,5,3,79,90,56,65};
        int low = 0;int high = a.length-1;
        _quickSort(a,low,high);
        System.out.println(Arrays.toString(a));

    }

    
    public static int getMiddle(int[] list, int low, int high){
        int tmp = list[low];//设置基准值为数组的第一个值
        int change;//设置交换变量
        while (low<high)
        {
            while (low<high && list[high]>=tmp) // 最开始从右边开始右边移动
            {
                high--; // 正常情况下右边的数据比基准数大,不用交换数据,右边继续开始向左移动
            }
            change = list[low]; // 如果基准数大于有边的数据,交换两个数,此时基数已经换到右边,下一步从左边开始移动
            list[low] = list[high];
            list[high] = change;
            while (low<high && list[low]<=tmp) //左边移动
            {
                low++; // 正常情况下左边数字比基数要小,继续移动
            }
            change = list[low];
            list[low] = list[high];
            list[high] = change;

        }
        return low; //当low和high相等时,一次排序结束,此时在low和high上面的就是基数,并且左边的数字小于基数,右边的数字大于基数
    }

    public static void _quickSort(int[] list,int low, int high){ 
               /*
                此函数实现递归,直到数组被分解到单个数字时,才会跳出函数,此时排序已经完成
                */
        if(low<high){
            int middle = getMiddle(list,low,high);
            _quickSort(list,low,middle-1);
            _quickSort(list,middle+1,high);
        }
    }

猜你喜欢

转载自www.cnblogs.com/zhz-8919/p/10617540.html