zoukankan      html  css  js  c++  java
  • 排序算法

    选择排序

    选择排序是一种简单直观的排序算法,基本的思想如下:

    首先在未排序的序列中找到最小的元素,存放在排序序列的起始位置;

    然后在从剩下的未排序的元素中继续寻找最小的元素,放在已排序序列的末尾;

    重复执行第二步,知道所有的元素均有序;

    具体的实现代码如下所示:

    public void sort(int [] a){
          for(int i=0;i<a.length;i++)
          {
                int min=i;
                for(int j=i+1;j<a.length;j++)
                {
                      if(a[j]<a[min])
                            min=j;
                }
                if(i!=min)
                {
                      int temp=a[i];
                      a[i]=a[min];
                      a[min]=temp;
                }
          }
    }
    
    

    冒泡排序

    冒泡排序的基本思想是:比较相邻的元素,如果第一个比后面的大,就交换它们;

    对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对,这一步做完之后,最后的元素会是最大的数,然后针对未排序的序列继续上面的操作,直到所有的元素有序;

    具体的实现代码如下所示:

    
    public void sort(int [] a){
          for(int i=1;i<a.length;i++)
          {
                for(int j=0;j<a.length-i;j++)
                {
                      if(a[j]>a[j+1])
                      {
                            int temp=a[j];
                            a[j]=a[j+1];
                            a[j+1]=temp;
                      }
                }
          }
    }
         
    
    

    快速排序

    快速排序采用的思想是分治思想,基本的步骤是首先找出一个元素作为基准,然后将所有元素进行分区操作,达到基准左边的元素都不大于基准值,基准右边的元素都不小于基准值,这样的操作称为一次快
    排,然后进行递归操作,将基准左边的元素进行快排,将基准右边的元素进行快排,最后达到所有元素有序。

    我觉得在编码的时候最主要的操作就是编写一遍快排,也就是将比基准小的都放在左边,反之放在右边。具体的代码如下:

    int quicksort(vector<int> &v, int left, int right){
            if(left < right){
                    int key = v[left];
                    int low = left;
                    int high = right;
                    while(low < high){
                            while(low < high && v[high] > key){
                                    high--;
                            }
                            v[low] = v[high];
                            while(low < high && v[low] < key){
                                    low++;
                            }
                            v[high] = v[low];
                    }
                    v[low] = key;
                    quicksort(v,left,low-1);
                    quicksort(v,low+1,right);
            }
    }
    

    归并排序

    归并排序采用的思想也是分治的思想,主要就是将元素分成两个部分,左边进行归并排序,右边进行归并排序,然后将左右两部分进行合并的操作。

    编码的时候主要的部分还是合并的操作,主要的代码如下所示:

    public class Merge {
        // 不要在 merge 函数里构造新数组了,因为 merge 函数会被多次调用,影响性能
        // 直接一次性构造一个足够大的数组,简洁,高效
        private static Comparable[] aux;
    
         public static void sort(Comparable[] a) {
            aux = new Comparable[a.length];
            sort(a, 0, a.length - 1);
        }
    
        private static void sort(Comparable[] a, int lo, int hi) {
            if (lo >= hi) return;
            int mid = lo + (hi - lo) / 2;
            sort(a, lo, mid);
            sort(a, mid + 1, hi);
            merge(a, lo, mid, hi);
        }
    
        private static void merge(Comparable[] a, int lo, int mid, int hi) {
            int i = lo, j = mid + 1;
            for (int k = lo; k <= hi; k++)
                aux[k] = a[k];
            for (int k = lo; k <= hi; k++) {
                if      (i > mid)              { a[k] = aux[j++]; }
                else if (j > hi)               { a[k] = aux[i++]; }
                else if (less(aux[j], aux[i])) { a[k] = aux[j++]; }
                else                           { a[k] = aux[i++]; }
            }
        }
    
        private static boolean less(Comparable v, Comparable w) {
            return v.compareTo(w) < 0;
        }
    }
  • 相关阅读:
    javascript闭包和作用域链
    关于git的简单实用命令
    springMVC配置Json
    Python基础教程(010)--第一个程序Hello Python
    Python基础教程(009)--Python程序的格式以及扩展名
    Python基础教程(008)--第一个Python程序
    Python基础教程(007)--Python的优缺点
    Python基础教程(006)--Python的特点
    Python基础教程(005)--为什么要学习Python?
    Python基础教程(004)--Python的设计哲学
  • 原文地址:https://www.cnblogs.com/noob-l/p/13586225.html
Copyright © 2011-2022 走看看