• 白话经典算法系列之一 冒泡排序的三种实现


    转载自:http://www.cnblogs.com/morewindows/archive/2011/08/06/2129603.html

    冒泡排序是非常容易理解和实现,以从小到大排序举例:

    设数组长度为N。

    1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。

    2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。

    3.N=N-1,如果N不为0就重复前面二步,否则排序完成。

    按照定义很容易写出代码:

    //冒泡排序1

    void BubbleSort1(int a[], int n)

    {

           int i, j;

     

           for (i = 0; i < n; i++)

                  for (j = 1; j < n - i; j++)

                         if (a[j - 1] > a[j])

                                Swap(a[j - 1], a[j]);

    }

    下面对其进行优化,设置一个标志,如果这一趟发生了交换,则为true,否则为false。明显如果有一趟没有发生交换,说明排序已经完成。

    //冒泡排序2

    void BubbleSort2(int a[], int n)

    {

           int j, k;

           bool flag;

          

           k = n;

           flag = true;

           while (flag)

           {

                  flag = false;

                  for (j = 1; j < k; j++)

                         if (a[j - 1] > a[j])

                         {

                                Swap(a[j - 1], a[j]);

                                flag = true;

                         }

                  k--;

           }

    }

    再做进一步的优化。如果有100个数的数组,仅前面10个无序,后面90个都已排好序且都大于前面10个数字,那么在第一趟遍历后,最后发生交换的位置必定小于10,且这个位置之后的数据必定已经有序了,记录下这位置,第二次只要从数组头部遍历到这个位置就可以了。

    //冒泡排序3

    void BubbleSort3(int a[], int n)

    {

           int j, k;

           int flag;

          

           flag = n;

           while (flag > 0)

           {

                  k = flag;

                  flag = 0;

                  for (j = 1; j < k; j++)

                         if (a[j - 1] > a[j])

                         {

                                Swap(a[j - 1], a[j]);

                                flag = j;

                         }

           }

    }

    冒泡排序毕竟是一种效率低下的排序方法,在数据规模很小时,可以采用。数据规模比较大时,最好用其它排序方法。

    package com.dsa;
    
    public class Sorter_Bubblesort {
    
        public static void main(String[] args) {
            int[] array = { 5, 2, 7, 4, 6, 3, 1 };
            sortWithLimit(array, 7);
            for (int i=0; i<array.length; i++) {
                System.out.print(array[i]);
            }
        }
        
        public static void sort(int[] array) {
            int n = array.length;
            int temp;
            for (int i=0; i<n; i++) {
                for (int j=1; j<n-i; j++) {
                    if (array[j-1] > array[j]) {
                        temp = array[j];
                        array[j] = array[j-1];
                        array[j-1] = temp;
                    }
                }
            }
        }
        
        public static void sortWithFlag(int[] array) {
            int n = array.length;
            int temp;
            boolean flag = true;
            while(flag) {
                flag = false;
                for (int i=0; i<n; i++) {
                    for (int j=1; j< n-i; j++) {
                        if (array[j-1] > array[j]) {
                            temp = array[j];
                            array[j] = array[j-1];
                            array[j-1] = temp;
                            flag = true;
                        }
                    }
                }
            }
        }
        
        public static void sortWithLimit(int[] array, int p) {
            int n = array.length;
            int k,temp;
            int flag = p;
            while(flag > 0) {
                k = flag;
                flag = 0;
                for (int i=0; i<k; i++) {
                    for (int j=1; j<k-i; j++) {
                        if (array[j-1] > array[j]) {
                            temp = array[j];
                            array[j] = array[j-1];
                            array[j-1] = temp;
                            flag = j;
                        }
                    }
                }
            }
        }
        
    }
  • 相关阅读:
    html基础教程2
    HTML的基础教程
    JS中响应函数和for循环执行问题
    Cookie显示上次访问时间出现错误的问题
    完全卸载VSCode--解决卸载重新安装后还有原来配置的问题
    servlet中输出HTML标签浏览器不能正常显示
    Java中Servlet输出中文乱码问题
    eclipse下配置Tomcat(没有Tomcat8及以上版本问题)
    Java多线程通信之wait()和notify()方法
    Java中synchronize关键字
  • 原文地址:https://www.cnblogs.com/IvySue/p/7479636.html
Copyright © 2020-2023  润新知