`

简单排序

J# 
阅读更多

冒泡排序

冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复以上过程,仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到最大数前的一对相邻数,将小数放前,大数放后,第二趟结束,在倒数第二个数中得到一个新的最大数。如此下去,直至最终完成排序。
  由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。
  用二重循环实现,外循环变量设为i,内循环变量设为j。外循环重复9次,内循环依次重复9,8,...,1次。每次进行比较的两个元素都是与内循环j有关的,它们可以分别用a[j]和a[j+1]标识,i的值依次为1,2,...,9,对于每一个i, j的值依次为1,2,...10-i。

package pku.ss.datastructure.Sort;   
  
public class BubbleSort {   
    public static void main(String[] args) {   
        int max = 1000000;   
        ArrayBubble arr = new ArrayBubble(max);   
  
        long startTime = System.currentTimeMillis();   
        for (int j = 0; j < max; j++) {   
            double element = (double) (java.lang.Math.random() * (max - 1));   
            arr.insert(element);   
        }   
        long endTime = System.currentTimeMillis();   
  
        System.out.println("Sort time: " + (endTime - startTime) + " ms");   
  
    }   
}   
  
class ArrayBubble {   
    private int nElement;   
    private double[] array;   
  
    ArrayBubble(int max) {   
        array = new double[max];   
        nElement = 0;   
    }   
  
    public void insert(double x) {   
        // if (array.length == 10) {   
        // System.out.println("[ERROR]Out of memory!");   
        // System.out.println("[INFO]Atempt to insert into a full array");   
        // System.exit(0);   
        // } else {   
        array[nElement] = x;   
        nElement++;   
        // }   
    }   
  
    public void display() {   
        for (int i = 0; i < nElement; i++) {   
            System.out.print(array[i] + " ");   
        }   
        System.out.println();   
        System.out.println();   
    }   
  
    public void bubbleSort() {   
        int outer;   
        for (outer = nElement - 1; outer > 0; outer--)   
            for (int j = 0; j < outer; j++) {   
                if (array[j] > array[j + 1]) {   
                    swap(j, j + 1);   
                }   
            }   
    }   
  
    private void swap(int x, int y) {   
        double temp;   
        temp = array[x];   
        array[x] = array[y];   
        array[y] = temp;   
    }   
}  

 
选择排序

已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变。再比较a[1]与a[3]的值,若a[1]大于a[3]则交换两者的值,否则不变。再比较a[1]与a[4],以此类推,最后比较a[1]与a[n]的值。这样处理一轮后,a[1]的值一定是这组数据中最小的。再将a[2]与a[3]~a[n]以相同方法比较一轮,则a[2]的值一定是a[2]~a[n]中最小的。再将a[3]与a[4]~a[n]以相同方法比较一轮,以此类推。共处理n-1轮后a[1]、a[2]、……a[n]就以升序排列了。
  优点:稳定,比较次数与冒泡排序一样;
  缺点:相对之下还是慢。

package pku.ss.datastructure.Sort;   
  
public class SelectSort {   
    public static void main(String[] args) {   
        int max = 1000000;   
        ArraySel arr = new ArraySel(max);   
  
        long startTime = System.currentTimeMillis();   
        for (int j = 0; j < max; j++) {   
            double element = (double) (java.lang.Math.random() * (max - 1));   
            arr.insert(element);   
        }   
        long endTime = System.currentTimeMillis();   
  
        System.out.println("Sort time: " + (endTime - startTime) + " ms");   
    }   
}   
  
/** ***************************************** */  
class ArraySel {   
    private double[] a;   
    private int nElement;   
    //--------------------------------------------------------   
    public ArraySel(int max) {   
        a = new double[max];   
        nElement = 0;   
    }   
    //--------------------------------------------------------   
    public void insert(double element) {   
        a[nElement] = element;   
        nElement++;   
    }   
    //--------------------------------------------------------   
    public void display() {   
        for (int i = 0; i < nElement; i++)   
            System.out.print(a[i] + " ");   
        System.out.println();   
    }   
    //--------------------------------------------------------   
    public void selectSort() {   
        int out, in, min;   
        for (out = 0; out < nElement - 1; out++) {   
            min = out;   
            for (in = out + 1; in < nElement; in++) {   
                if (a[in] < a[min]) {   
                    min = in;   
                }   
            }   
            if(min!=out)   
                swap(min, out);   
        }   
    }   
    //--------------------------------------------------------   
    private void swap(int x, int y) {   
        double temp;   
        temp = a[x];   
        a[x] = a[y];   
        a[y] = temp;   
    }   
}  

 

插入排序

已知一组升序排列数据a[1]、a[2]、……a[n],一组无序数据b[1]、b[2]、……b[m],需将二者合并成一个升序数列。首先比较b[1]与a[1]的值,若b[1]大于a[1],则跳过,比较b[1]与a[2]的值,若b[1]仍然大于a[2],则继续跳过,直到b[1]小于a数组中某一数据a[x],则将a[x]~a[n]分别向后移动一位,将b[1]插入到原来a[x]的位置这就完成了b[1]的插入。b[2]~b[m]用相同方法插入。(若无数组a,可将b[1]当作n=1的数组a)
  优点:稳定,快;
  缺点:比较次数不一定,比较次数越少,插入点后的数据移动越多,特别是当数据总量庞大的时候,但用链表可以解决这个问题。

package pku.ss.datastructure.Sort;   
  
public class InsertionSort {   
    public static void main(String[] args) {   
        int max = 1000000;   
        ArrayIns arr = new ArrayIns(max);   
  
        long startTime = System.currentTimeMillis();   
        for (int j = 0; j < max; j++) {   
            double element = (double) (java.lang.Math.random() * (max - 1));   
            arr.insert(element);   
        }   
        long endTime = System.currentTimeMillis();   
  
        System.out.println("Sort time: " + (endTime - startTime) + " ms");   
    }   
}   
  
class ArrayIns {   
    private double[] a;   
    private int nElement;   
  
    // --------------------------------------------------------   
    public ArrayIns(int max) {   
        a = new double[max];   
        nElement = 0;   
    }   
  
    // --------------------------------------------------------   
    public void insert(double element) {   
        a[nElement] = element;   
        nElement++;   
    }   
  
    // --------------------------------------------------------   
    public void display() {   
        for (int i = 0; i < nElement; i++)   
            System.out.print(a[i] + " ");   
        System.out.println();   
    }   
  
    // --------------------------------------------------------   
    public void insertionSort() {   
        int out, in;   
        for (out = 1; out < nElement; out++) {   
            double temp = a[out];   
            in = out;   
            while (in > 0 && a[in - 1] >= temp) {   
                a[in] = a[in - 1];   
                in--;   
            }   
            a[in] = temp;   
        }   
    }   
    // --------------------------------------------------------   
  
}  

 

 

分享到:
评论

相关推荐

    简单排序算法简介

    ### 简单排序算法简介 #### 一、简单排序算法概述 在计算机科学领域,**排序算法**是一类非常基础且重要的算法。这类算法旨在将一组无序的数据按照特定的顺序进行排列。由于实际应用中往往需要处理大量的数据,...

    第四章 简单排序(C++)_PDF(2020.06.10).rar

    在本资源中,我们主要探讨的是C++编程语言中的简单排序算法。这些算法是计算机科学的基础,对于理解和解决编程问题,特别是在数据处理和优化效率方面至关重要。"NOIP"(全国青少年信息学奥林匹克竞赛)和"信奥"指的...

    1.10编程基础之简单排序(10题)--题目 有链接.pdf

    简单排序是编程基础中的一个重要环节,它包括了基本的排序算法,如选择排序、插入排序、冒泡排序等。以下是对“1.10编程基础之简单排序(10题)--题目 有链接.pdf”文件内容的详细知识点说明。 1. 排序算法概述: ...

    VB 排序 简单排序 文本框取数字排序 字符串取数字排序

    在这个主题中,我们将深入探讨VB中的简单排序算法,特别是如何处理文本框中的数字排序以及从字符串中提取数字进行排序。 1. **简单排序算法**: - **冒泡排序**:是最基础的排序方法,通过不断地比较相邻元素并...

    链表的简单排序

    链表的简单排序 链表是一种基本的数据结构,它由多个节点组成,每个节点都包含一个指向下一个节点的指针。今天,我们来讨论链表的简单排序。 链表的简单排序需要使用到链表的基本操作,包括链表的创建、遍历和排序...

    利用C++向量的简单排序

    利用C++向量的简单排序 本资源旨在介绍利用C++中的Vector实现简单排序的方法。该资源通过实例代码,详细地展示了如何使用Vector容器来存储整数,并使用选择排序算法对其进行排序。 知识点一:C++中的Vector容器 ...

    快速排序归并排序简单排序算法比较

    自己写的三个排序算法的比较。快速排序、归并排序、简单排序 对三个排序算法所消耗时间进行统计,比较时间效率 程序是在Linux下用C写的,vc下并未做测试。

    简单插入排序,实现简单排序方法

    c++实验之一:简单插入排序 实现简单排序方法

    Excel简单排序的例子.rar

    本例子以"26.4简单排序的例子.xls"为载体,展示了如何按照“科目名称”的笔划顺序进行升序排序。 首先,打开Excel工作簿,可以看到一个包含多个科目名称的数据表。这些科目可能是学校课程、公司部门或其他需要排序...

    西电数据结构第六次上机简单排序代码

    题目一 简单排序方法 【问题描述】 简单排序算法主要包括冒泡排序、简单选择排序和直接插入排序,它们都是时间复杂度为的排序方法,需要熟练掌握。 【基本要求】 用随机函数产生10000(或更多)个整数(或浮点数...

    简单排序法(C#)

    本项目“简单排序法(C#)”聚焦于三种基本的排序算法:冒泡排序、选择排序和插入排序,这些都是C#编程初学者必须掌握的基本技能。 1. **冒泡排序**: 冒泡排序是一种简单的排序算法,通过重复遍历待排序的元素列表...

    《Java数据结构和算法》学习笔记(2)——4种简单排序算法

    本文将深入探讨四种简单的排序算法:插入排序、冒泡排序、选择排序。这些算法虽然在复杂度上不如高级排序算法如快速排序或归并排序,但它们提供了基础的排序逻辑,有助于理解更复杂的算法思想。 首先,我们来详细...

    java数组与简单排序

    本主题将深入探讨“java数组与简单排序”,涵盖有序数组、线性查找和二分法查找等核心概念。 有序数组是指数组中的元素按照特定顺序排列,例如升序或降序。在处理有序数组时,我们可以利用其特性来优化查找和操作...

    1.认识复杂度和简单排序算法1

    本节我们将深入探讨时间复杂度、简单排序算法以及评估算法效率的方法。 时间复杂度是衡量算法运行时间与输入数据量之间的关系,通常用大O记法表示。常数操作,如赋值`int a = arr[i]`或基本算术运算`+-*/`、位运算...

    第四章 简单排序(C++)_codes(2020.06.04).rar

    在本压缩包文件"第四章 简单排序(C++)_codes(2020.06.04).rar"中,包含的是关于C++编程语言实现简单排序算法的相关代码。这些代码可能是为了帮助学习者理解并掌握基础的排序算法,特别是针对信息学竞赛(如信奥)和...

    各种简单排序

    ### 各种简单排序 #### 内容概览 本文主要介绍了几种常见的简单排序算法,包括冒泡排序、交换排序(通常指冒泡排序的一种变体)、选择排序以及插入排序。这些排序算法虽然效率不是最高,但它们的概念简单且易于...

    简单排序算法--类的简单使用

    在编程领域,排序算法是计算机科学中的基础概念,它用于对一组数据进行排列,以便于检索、分析或处理。在本主题中,我们将探讨如何使用C++类来实现不同的排序算法,并理解类在实现这些算法时的角色。我们将重点关注...

Global site tag (gtag.js) - Google Analytics