引言:这是我对常用算法的初步理解,如有不足敬请指正,谢谢!
1.【选择排序法】
初始数组 【63 4 24 1 3 15 】
第一次排序 【4 24 1 3 15 】 63
第二次排序 【4 1 3 15 】 24 63
第三次排序 【4 1 3 】 15 24 63
第四次排序 【1 3 】 4 15 24 63
第五次排序 【1 】 3 4 15 24 63
特点:每一次从待排序的数据中选出最小(或最大)的一个元素,顺序放到已经排好序的数列最后,直达全部排完!
使用:如果数组有重复值,可选择该排序方法,因为遇到重复相等的值不会做任何处理,如果程序允许重复,该方法数据交换次数少,效率高!
程序:
private int[] array = new int[10];
protected void do_button_actionPerformed() {
// 创建随机数对象
Random random = new Random();
for (int i = 0; i < array.length; i++) {
// 初始化数组元素,生成50以内的随机数
array[i] = random.nextInt(50);
}
}
//核心算法
protected void do_button_1_actionPerformed() {
int index;
for (int i = 1; i < array.length; i++) {
index = 0;
for (int j = 1; j <= array.length - i; j++) {
if (array[j] > array[index]) {
index = j;// 查找最大值
}
}
// 交换在位置array.length-i和index(最大值)两个数
int temp = array[array.length - i];
array[array.length - i] = array[index];
array[index] = temp;
}
}
2.【冒泡排序】
定义:基本思想是对比相邻的元素值,如果满足条件就交换元素,把较小的移动到前面,这样数组就像气泡一样从底部上升到顶部。
特点:比较的次数依排序轮数递减,因为每次都会确定一个最大值!
程序:
private int[] array = new int[10];
protected void do_button_actionPerformed(ActionEvent e) {
Random random = new Random();
for (int i = 0; i < array.length; i++) {
array[i] = random.nextInt(50);
}
}
//核心算法
protected void do_button_1_actionPerformed(ActionEvent e) {
for (int i = 1; i < array.length; i++) { // 长度为N的数组,循环轮数N-1,每次找出一个最大值
// 比较相邻两个元素,较大的数往后冒泡
for (int j = 0; j < array.length - i; j++) {
if (array[j] > array[j + 1]) {
int temp = array[j];// 把第一个元素值保持到临时变量中
array[j] = array[j + 1];// 把第二个元素值保存到第一个元素单元中
array[j + 1] = temp;// 把临时变量也就是第一个元素原值保持到第二个元素中
}
}
}
3.【快速排序】
定义:对冒泡排序的一种改进,基本思想,通过一趟排序把要排序的数据分成2部分,其中一部分比参考数(通常选取每个部分的第1个数)小的,另一部分都是比参考数大的,对每个部分进行递归处理,直到每个部分只有一个元素即完成排序.
例子:
初始数组: 49 38 65 97 76 13 27 49
第一次排序: {27 38 13} 49{76 97 65 49}
对左边序列排序: {13}27{38} 49{76 97 65 49}
对右边排序: {65 49}76{97}
对右边继续排序: {49}65
完成排序的序列: {13}27{38}49 49}65 76{97}
核心算法:
private int[] array = new int[10];
protected void do_button_actionPerformed(ActionEvent e) {
Random random = new Random();
for (int i = 0; i < array.length; i++) {
array[i] = random.nextInt(90);
}
}
//调用快速排序的方法,传入初始参数
protected void do_button_1_actionPerformed(ActionEvent e) {
quickSort(array, 0, array.length - 1);
}
//快速排序的逻辑排序相对复杂一些
private void quickSort(int sortarray[], int lowIndex, int highIndex) {
int lo = lowIndex;// 记录最小索引
int hi = highIndex;// 记录最大索引
int mid;// 记录分界点元素
if (highIndex > lowIndex) {
// 确定中间分界点元素值,sortarray[]数组
mid = sortarray[(lowIndex + highIndex) / 2];
while (lo <= hi) {
while ((lo < highIndex) && (sortarray[lo] < mid))
++lo;// 确定不大于分界元素值的最小索引
while ((hi > lowIndex) && (sortarray[hi] > mid))
--hi;// 确定大于分界元素值的最大索引
if (lo <= hi) {// 如果最小与最大索引没有重叠
swap(sortarray, lo, hi);// 交换两个索引的元素
++lo;// 递增最小索引
--hi;// 递减最大索引
}
}
if (lowIndex < hi)// 递归排序没有未分解元素
quickSort(sortarray, lowIndex, hi);
if (lo < highIndex)// 递归排序没有未分解元素
quickSort(sortarray, lo, highIndex);
}
}
private void swap(int swapArray[], int i, int j) {
// 交换数组元素
int temp = swapArray[i];
swapArray[i] = swapArray[j];
swapArray[j] = temp;
}
4.【直接插入排序】
定义: 将一个记录插入到有序数列中,使得到的新数列依然有序,插入一个新的元素会使得元素后面的数字向后移动一位.
例子:2,8,7,5,9,6
获取第一个元素: 2{ 8,7,5,9,6}
依次插入后面的元素: 2,8{ 7,5,9,6}
依次插入后面的元素: 2,7,8{ 5,9,6}
依次插入后面的元素: 2,5,7,8{ 9,6}
依次插入后面的元素: 2,5,7,8 ,9{6}
依次插入后面的元素: 2,5,6,7,8 ,9
核心算法:
private int[] array = new int[10];
protected void do_button_actionPerformed(ActionEvent e) {
Random random = new Random();
for (int i = 0; i < array.length; i++) {
array[i] = random.nextInt(90);
}
}
protected void do_button_1_actionPerformed(ActionEvent e) {
int tmp;// 定义临时变量
int j;
for (int i = 1; i < array.length; i++) {
tmp = array[i];// 保存临时变量
for (j = i - 1; j >= 0 && array[j] > tmp; j--) {
array[j + 1] = array[j];// 数组元素交换
}
array[j + 1] = tmp;// 在排序位置插入数据
}
}
相关推荐
标题中的“初识A*寻路算法”表明我们要探讨的是计算机科学中的一种路径搜索算法——A*(A-star)算法。A*算法是Dijkstra算法的优化版本,广泛应用于游戏开发、地图导航、网络路由等领域,它通过引入启发式信息来实现...
Java语言技术初识 Java,作为一种革命性的编程语言,由Sun Microsystems公司的James Gosling等人于1991年创立,并于1995年正式发布。它的核心特性是跨平台能力,这得益于Java虚拟机(JVM),使得“编写一次,到处...
《算法电子书 初识ACM090216》是针对计算机科学中的一个重要领域——算法设计与分析的一本入门级电子教材。ACM,全称美国计算机学会(Association for Computing Machinery),是全球计算机科学领域的权威组织,其...
【Java数组初识与排序】 在Java编程语言中,数组是一种非常重要的数据结构,它允许我们在同一时间存储多个相同类型的数据。本章将详细介绍数组的概念、应用、排序算法以及多维数组。 ### 1. 数组概念 1.1 为什么...
#### 一、初识算法 **1.1 什么是算法?** 算法是指解决问题的一系列步骤或指令集。它是一种清晰、有限的指导过程,用于完成特定任务或解决特定类型的问题。一个好的算法应当具备明确性、可行性、输入/输出特性和有...
阶段一,初识Java世界。这一阶段主要涉及Java的基础知识和面向对象编程(OOP)概念。学员将学习Java的基本语法,如变量、数据类型、运算符、控制结构等。对象的创建、封装、继承和多态是OOP的核心,也是Java编程的...
Java技术合集是一个涵盖Java编程语言众多核心技术的资源集合,非常适合初学者和进阶者进行系统性的学习。这个合集可能包含了大量的文档、教程、...无论是初识Java的新人还是希望巩固技能的开发者,都可以从中受益匪浅。
初识java;目录中文件数:6个 ├─class001.rar ├─eclipse-jee-photon-R-win32-x86_64.zip ├─jdk-8u121-windows-i586.exe ├─jdk-8u121-windows-x64.exe ├─数据类型和运算符.ppt ├─笔记.docx (2)\10.实用类 ...
初识Java 9模块化编程.pdf 区块链难理解?200行代码教你写一个自己的区块链!.pdf 十个问答助你了解 Redis 高可用架构及 Redis 运维.pdf 后Kubernetes时代,带你系统梳理K8S 12大关键特性.pdf 容器如“衣服”,而...
#### 第一章 初识Java - **Java跨平台原理**:Java的跨平台特性主要得益于字节码文件(`.class`文件)和Java虚拟机(JVM)。Java程序编译成字节码文件后,由不同平台上的JVM解释执行这些字节码文件,从而实现了“一...
5. **chapter2**:初识Java,可能包含基本语法,如变量声明、数据类型、运算符、流程控制(if、for、while)等,以及简单的函数和方法。 6. **chapter36**:可能涉及的是输入/输出流的更深入话题,如对象序列化或...
初识分布式架构与意义 如何把应用从单机扩展到分布式 大型分布式架构演进过程 分布式架构设计 主流架构模型-SOA架构和微服务架构 领域驱动设计及业务驱动规划 分布式架构的基本理论CAP、BASE以及其应用 什么...
首先,Flink的处理速度非常快,能够以极高的速度处理数据密集型和迭代任务,这得益于其基于内存的数据流处理能力和深度集成的迭代处理算法。其次,Flink的可靠性与可扩展性非常强,拥有自己的内存管理组件、序列化...
初识Java部分,主要介绍了Java的发展历程、应用领域以及与其他编程语言的区别,帮助读者建立对Java的基本认知。 接下来,书中逐步深入到Java语法的核心,如数据类型和运算符。这部分内容涵盖了基本数据类型、引用...
#### 一、初识算法 ##### 1.1 什么是算法? **定义**:在数学和计算机科学领域,算法是指一系列有限的严谨指令,这些指令通常用于解决一类特定的问题或者执行某种计算。算法是解决问题的一种明确步骤,它可以接受...
#### 一、初识Java 1. **Java的由来** - Java语言最初由Sun Microsystems公司于1995年推出,它是由James Gosling领导的一个团队设计并实现的。Java的设计目标是实现面向网络的、跨平台的应用程序编程语言。 2. **...
在这个“data_mining:一些数据挖掘算法的实现”项目中,我们可以推测作者提供了一些用Java语言实现的数据挖掘算法。Java作为一种广泛使用的编程语言,因其跨平台性、高效性和丰富的库支持,常被用于大数据处理和分析...