【冒泡排序】、【快速排序】

冒泡排序法

   冒泡排序是一种简单的排序方法,这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

   它重复地走访过要排序的元素列,一次比较两个相邻的元素,如果他们的顺序有错误,就把他们的位置交换,走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说改元素已经排序完成。

算法原理

   
- 比较相邻的元素,如果第一个比第二个大,就交换他们的位置。
- 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
这里写图片描述

核心代码

 int[] arr = new int[] { 5, 4, 9, 1, 8, 3, 7, 2, 6, 0 };  //定义数组
            int temp = 0;

            for (int i = 0; i < arr.Length - 1; i++)         //外层循环,总趟数
            {
                for (int j = 0; j < arr.Length - 1 - i; j++)   //内层循环,每次比较的次数,越来越少的
                {
                    if (arr[j] > arr[j + 1])                   //交换位置
                    {
                        temp = arr[j];
                        arr[j] = arr[j + 1];
                        arr[j + 1] = temp;
                    }
                }
            }

快速排序

   快速排序是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

   在N个记录里,选取一个基准值Key,通常取第一个记录键值为基准值Key,还需要两个指针Low和High,数组第一个数为Low值,最后一个数为High值。Low和High分别与Key的值作比较,如果位置错误则交换位置,如果位置正确指针则往前走(如果一个指针和Key是一个值则另一个指针走,直到两个指针走到一起)。第一趟排序之后知道到Key的位置,如果从小到大,Key值左面都是小于Key值的数,右面都是大于Key的数。
   以Key值为基准左右分成两个数组,分别在进行以上步骤。重新先去Key、Low、High的值。

第一趟排序的过程

起初数组 6 2 9 4 7 3 Low为6,Key为6,High为3
第一次交换 3 2 9 4 7 6 Low为2,Key为6,High为6
第二次交换 3 2 9 4 7 6 位置正确,不做交换,Low为9,Key为6,High为6
第三次交换 3 2 6 4 7 9 Low为6,Key为6,High为7
第四次交换 3 2 6 4 7 9 位置正确,不做交换,Low为6,Key为6,High为4
第五次交换 3 2 4 6 7 9 Low为6,Key为6,High为6

   第一次趟排序完成,找到Key 的为,左面都是小于它的数,右面都是大于它的数,然后从Key值分成两个数组,在做上面的步骤。

核心代码

 public static int[] QuickSort(int[] nums, int low, int high)
        {
            if (low < high)
            {
                int temp = QuickPartition(nums, low, high);
                QuickSort(nums, low, temp - 1);       //对左边的数组进行排序
                QuickSort(nums, temp + 1, high);      //对右边的数组进行排序
            }
            return nums;
        }


        public static int QuickPartition(int[] nums, int low, int high)
        {
            int x = nums[low];
            while (low < high)
            {
                //从High值往前去找小于等于Key 的数
                while ((low < high) && (nums[high] >= x))
                {
                    high--;
                }
                nums[low] = nums[high];
                //从Low值往后去找大于等于Key的数
                while ((low < high) && (nums[low] <= x))
                {
                    low++;
                }
                nums[high] = nums[low];
            }
            nums[low] = x;
            return low;
        }

总结

   冒泡排序很好理解,对于快速排序,我建议应该去纸上把每次交换的数字都写上,虽然这样很麻烦,但是这也是让我们更直观的看到他们是怎么走的! 感谢那些巨人们,我们要站在他们的肩膀上!
   如有错误,还请各位大佬在评论区多多指正,非常感谢!!!

猜你喜欢

转载自blog.csdn.net/ywq1016243402/article/details/82023249
今日推荐