几种基础排序算法的实现(Java C++)

  最近在复习数据结构/算法,准备把以前的基础知识都实现一边,过一过。也写写我人生中的第一篇技术博文…只求自己能把学过的东西梳理一便,加深记忆。

一、插入排序。

  设计思想:从数组的第二个元素开始循环,并将此元素设为key(通俗的理解就是数组中正在为它排序的元素),再把此元素与之前的所有已经排好序的元素进行比较,找到合适的位置后,继续循环,直到数组中的最后一个元素为止。

(C++)

 1 void insertSort(int *array, int length) {
 2     for (int i = 1; i < length; i++) {
 3         int key = array[i];
 4         int j = i - 1;
 5         while (j >= 0 && array[j] > key) {
 6             array[j + 1] = array[j];
 7             array[--j + 1] = key;
 8         }
 9     }
10 }

(Java)

public static void insertSort(int[] array) {
        if (array == null) {
            return;
        }
        if (array.length <= 1) {
            return;
        }
        for (int i = 1; i < array.length; i++) {
            int key = array[i];
            int j = i - 1;
            while (j >= 0 && key < array[j]) {
                array[j + 1] = array[j];
                array[--j + 1] = key;
            }
        }
    }

在插入排序的实现中,把二层循环的判断条件设置为递减而不是递增,可以有效的提高算法的效率。

  试想, j 为 0到 i-1 递增判断,设当前的 key 在x位 (0...x...i-1  — [0,i-1] 是数组中已经排序号的部分),递增判断则需要首先从0到x找到 x位,然后再进行 x+1 到 i 的数组移位,最后再将 key 放置到 x位上。

  而为递减判断时,key 跟随 j 一起向后数组的头部移动,而当遇到小于 key 的元素时, while循环 停止。相比比递增判断,递减判断只需要移位的时间,就可以找到key所在的位置了。

二、冒泡排序

  设计思想:冒泡排序是通过元素的顺序两两比较,再将较大的元素推到数组的尾部,过程就像冒泡一样,经过一次遍历后,就可以得到一个有序的数组。

(C++)

void bubbleSort(int *array, int length) {
    int temp;
    for (int i = 0; i < length; i++) {
        for (int j = length - 1; j > i; j--) {
            if (array[i] > array[j]) {
                temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
        }
    }
}

(Java)

 1 public static void bubbleSort(int[] array) {
 2         for (int i = 0; i < array.length - 1; i++) {
 3             for(int j = array.length - 1 ; j > i ; j -- ) {
 4                 if(array[j] < array[j-1]) {
 5                     int temp = array[j-1];
 6                     array[j-1] = array[j];
 7                     array[j] = temp;
 8                 }
 9             }
10         }
11     }

以上的冒泡排序算法也和插入排序一样,使用了 j 递减条件来提高算法效率,因为 j 的初值与 i 的值相关联。可以通过将已排序好的数值推到i的前面,就可以有效的去掉未排序数与已排序好的数组元素比较,从而提高算法的效率。

时间: 2024-12-17 08:05:30

几种基础排序算法的实现(Java C++)的相关文章

各种排序算法的实现Java

 public class sort {  /**   * @param args   */  public static void main(String[] args) {   int[] data = {8,4,9,2,1,6,3,7,5};   for (int i = 0; i < data.length; i++) {    System.out.print(data[i]+" ");   }   System.out.println();   sort s = ne

七种排序算法的实现和总结

最近把七种排序算法集中在一起写了一遍. 注释里有比较详细的说明. 1 /*排序算法大集合**/ 2 #include <stdio.h> 3 #include <string.h> 4 #include <stdlib.h> 5 6 //------------------快速排序------------------// 7 /* 8 核心: 9 如果你知道多少人该站你前面,多少人站你后面,你一定知道你该站哪个位置. 10 算法: 11 1.选取分界数,参考这个分界数,

探讨排序算法的实现

排序算法是我们工作中使用最普遍的算法,常见的语言库中基本都会有排序算法的实现,比如c标准库的qsort,stl的sort函数等.本文首先介绍直接插入排序,归并排序,堆排序,快速排序和基数排序等比较排序算法,然后介绍计数排序,基数排序等具有线性时间的排序算法.本文主要讨论算法的实现方法,并不会过多介绍基本理论. 评价一个排序算法优劣适用与否,一般需要从三个方面来分析 时间复杂度.用比较操作和移动操作数的最高次项表示,由于在实际应用中最在乎的是运行时间的上限,所以一般取输入最坏情况的下的运行时间作为

Python学习(三) 八大排序算法的实现(下)

本文Python实现了插入排序.基数排序.希尔排序.冒泡排序.高速排序.直接选择排序.堆排序.归并排序的后面四种. 上篇:Python学习(三) 八大排序算法的实现(上) 1.高速排序 描写叙述 通过一趟排序将要排序的数据切割成独立的两部分,当中一部分的全部数据都比另外一部分的全部数据都要小,然后再按此方法对这两部分数据分别进行高速排序,整个排序过程能够递归进行,以此达到整个数据变成有序序列. 1.先从数列中取出一个数作为基准数. 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全

7种基本排序算法的Java实现

7种基本排序算法的Java实现 转自我的Github 以下为7种基本排序算法的Java实现,以及复杂度和稳定性的相关信息. 以下为代码片段,完整的代码见Sort.java 插入排序 1 /** 2 * 直接插入排序 3 * 不稳定 4 * 时间复杂度:O(n^2) 5 * 最差时间复杂度:O(n^2) 6 * 空间复杂度:O(1) 7 * 使用场景:大部分元素有序 8 * @param elements 9 * @param comparator 10 * @param <T> 11 */ 1

Python 排序算法的实现

冒泡排序: 1 def bubble(l): 2 length = len(l) 3 for i in range(length): 4 for j in range(i+1, length): 5 if l[i] > l[j]: 6 l[i], l[j] = l[j], l[i] 7 print l 选择排序: 1 def select(l): 2 length = len(l) 3 for i in range(length): 4 minn = i 5 for j in range(i+1

php四种基础排序算法的运行时间比较!

/** * php四种基础排序算法的运行时间比较 * @authors Jesse (jesse152@163.com) * @date 2016-08-11 07:12:14 */ //冒泡排序法 function bubbleSort($array){ $temp = 0; for($i = 0;$i < count($array) -1;$i++){ for($j = 0;$j < count($array) - 1 -$i;$j++){ if($array[$j] > $arra

php四种基础排序算法的运行时间比较

/** * php四种基础排序算法的运行时间比较 * @authors Jesse (jesse152@163.com) * @date 2016-08-11 07:12:14 */ //冒泡排序法 function bubbleSort($array){ $temp = 0; for($i = 0;$i < count($array) -1;$i++){ for($j = 0;$j < count($array) - 1 -$i;$j++){ if($array[$j] > $arra

软考笔记第六天之各排序算法的实现

对于前面的排序算法,用c#来实现 直接插入排序: 每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序.第一趟比较前两个数,然后把第二个数按大小插入到有序表中: 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中:依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程.直接插入排序属于稳定的排序,最坏时间复杂性为O(n^2),空间复杂度为O(1).直接插入排序是由两层嵌套循环组成的.外层循环标识并决定待比较的数值.内层循环为待比较数值确定其最终位