昨天太忙了,没时间整理,今天一起发布,我们来看看笔试或者面试中经常涉及的几类排序算法,打冲锋
的是冒泡,选择和排序,我们统称为简单排序算法:
1.定义:
首先我们定义个样例数组:
88,33,44,66,11
冒泡排序:顾名思义,就是整个过程就行气泡一样往上升,具体思想就是从头开始,依次比较相邻的两个数,将小数放在前面,大数放在后边,直至比较最后两个数,重复以上过程直至最终完成排序:
33,44,66,11 [88] 88 浮出
33,44,11 [88 66] 66 浮出
33,11[88 66 44] 40浮出
11[88 66 44 33] ......
[88 66 44 33 11] 结束
代码实现:
public static void bubbleSort(int[] number) {
//定义一个标志位,如果内循环没有发生交换,则表示有序,直接退出
boolean flag = true;
for (int i = 0; i < number.length - 1 && flag; i++) {
flag = false;
for (int j = 0; j < number.length - i - 1; j++) {
if (number[j + 1] < number[j]) {
swap(number, j + 1, j);
flag = true;
}
}
}
}
private static void swap(int[] number, int i, int j) {
int temp;
temp = number[i];
number[i] = number[j];
number[j] = temp;
}
选择排序:每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕。
[11]88,33,44,66选择出最小值11
[11 33]88,44,66选择出最小值33
[11 33 44]88,66 选择出最小值44
[11 33 44 66]88......
[11 33 44 66 88]结束
代码实现:
public static void selectionSort(int[] number) {
for (int i = 0; i < number.length - 1; i++) {
int num = i;
for (int j = i + 1; j < number.length; j++)
if (number[j] < number[num])
num = j;
if (i != num)
swap(number, i, num);
}
}
private static void swap(int[] number, int i, int j) {
int temp;
temp = number[i];
number[i] = number[j];
number[j] = temp;
}
插入排序: 每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。
[33 88]44,66,11 將33插入88前
[33 44 88]66,11 將44插入88前
[33 44 66 88]11 將66插入88前
[11 33 44 66 88]將11插入33前
代码实现:
public static void insertionSort(int[] number) {
for (int j = 1; j < number.length; j++) {
int temp = number[j];
int i = j - 1;
while (temp < number[i]) {
number[i + 1] = number[i];
i--;
if (i == -1)
break;
}
number[i + 1] = temp;
}
}
2.典型案例&&时间复杂度分析
int[] data = new int[100000];
java.util.Random r = new java.util.Random();
for (int i = 0; i < data.length; i++) {
data[i] = r.nextInt(10000);
}
int[] insertionSortArrays =data.clone();
int[] selectionSort =data.clone();
long insertstarttime = System.currentTimeMillis();
System.out.println("insertionSort start.....");
InsertSortedTest.insertionSort(insertionSortArrays);
long insertendtime = System.currentTimeMillis();
System.out.println("insertionSort end.....");
System.out.println("insertionSort total time : "
+ (insertendtime - insertstarttime) / 1000 + "秒");
long csstarttime = System.currentTimeMillis();
System.out.println("selectionSort start.....");
CsortedTest.selectionSort(selectionSort);
long csendtime = System.currentTimeMillis();
System.out.println("selectionSort end.....");
System.out.println("selectionSort total time : "
+ (csendtime - csstarttime) / 1000 + "秒");
long bubblestarttime = System.currentTimeMillis();
System.out.println("bubbleSort start...");
MpsortTest.bubbleSort(data);
long bubbleendtime = System.currentTimeMillis();
System.out.println("bubbleSort end...");
System.out.println("bubbleSort total time : "
+ (bubbleendtime - bubblestarttime) / 1000 + "秒");
执行结果:
insertionSort start.....
insertionSort end.....
insertionSort total time : 15秒
selectionSort start.....
selectionSort end.....
selectionSort total time : 41秒
bubbleSort start...
bubbleSort end...
bubbleSort total time : 73秒
可以看到在数据量不是很大的时候,插入排序优于选择排序,选择排序优于冒泡排序:
分析:
冒泡排序:若数组或者序列是正序,一次扫描就可以完成操作,所以最好的的时间复杂度为O(n),反之,如果是倒序,正序排序,则需要的时间复杂度为O(n2)
外部总循环X内部总循环),平均时间复杂度为O(n2)。
选择排序:无论文件初始状态如何,在第j趟排序中选出最小关键字的记录,需做j-i次比较,因此,总的比较次数为:n(n-1)/2=0(n2),择排序的平均时间复杂
度为O(n2)。
插入排序:平均时间复杂度为O(n)
分享到:
相关推荐
选择排序算法也是一种简单的排序算法,它的工作原理是通过选择最小或最大元素,并将其与第一个元素交换,以达到排序的目的。选择排序算法的时间复杂度也为O(n^2),因此它也适合小规模的数据排序。 3.插入排序算法 ...
算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...
本篇文章将深入探讨标题和描述中提到的九大排序算法:快速排序、冒泡排序、堆排序、希尔排序、直接插入排序、直接选择排序、基数排序、箱排序和桶排序。 1. **快速排序**:快速排序是一种基于分治策略的排序算法,...
- 各种排序算法如冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、基数排序和计数排序的时间复杂度。 - 排序算法的稳定性,例如快速排序是不稳定的,而归并排序是稳定的。 3. **字符串处理...
在计算机科学领域,数据结构和排序算法是编程基础的重要组成部分,特别是对于C语言这样底层而强大的编程工具。本文将深入探讨“C语言数据结构内部排序算法及比较”这一主题,结合个人课程作业的经验,对一些核心概念...
2. 冒泡排序:是最简单的排序算法之一,通过不断交换相邻位置的元素来逐渐达到排序的目的。每一轮遍历都能确保最大(或最小)的元素被放置到正确的位置,重复这个过程直到整个数组排序完成。 3. 选择排序:每次从未...
综上所述,插入排序是一种简单但实用的排序算法,适用于特定场景,通过理解其工作原理和优化方法,我们可以更好地选择和应用合适的排序算法。在实际编程中,了解和掌握不同排序算法的特点对于提升程序性能至关重要。
本话题主要探讨六种内部排序算法:直接插入排序、希尔排序、冒泡排序、快速排序、选择排序以及堆排序。这六种排序算法各有优劣,适用于不同的场景,接下来我们将逐一进行详细阐述。 1. **直接插入排序**: 直接...
数据结构之排序算法,使用Java实现,包括冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序_Data-Structure-Sort-Algorithm
数据结构中的排序算法是计算机科学中的重要概念,用于组织和管理数据,提高数据访问和处理的效率。在C++编程中,实现各种排序算法能够帮助理解它们的工作原理,并且可以对比不同算法在不同情况下的性能。以下是几种...
在计算机科学领域,数据结构和算法是核心研究对象,其中排序算法作为基础且重要的算法之一,广泛应用于各类数据处理场景。本实验旨在深入理解并掌握一种典型的交换排序算法——冒泡排序,通过对其实现和优化,计算在...
此文件为数据结构中的九种排序算法,包含一些排序方法的过程,其九种排序包括:直接插入排序,折半插入排序,希尔排序,冒泡排序,快速排序,选择排序,堆排序,归并排序,基数排序!
在这个实验中,我们将关注六种不同的排序算法:选择排序、冒泡排序、插入排序、基数排序以及快速排序和归并排序。下面是对这些排序算法的详细解释: 1. **选择排序**:选择排序是一种简单直观的排序算法,它的工作...
在计算机科学领域,排序算法是数据结构与算法中不可或缺的一部分,它们用于对一组数据进行排列,使其按照特定的顺序呈现。本资源包含三个经典的排序算法的源代码:插入排序、选择排序和冒泡排序,这些都是初级到中级...
**选择排序**是一种简单直观的排序算法,它的工作原理如下:在未排序的序列中找到最小(或最大)的元素,存放到排序序列的起始位置,然后再从剩余未排序的元素中继续寻找最小(或最大)的元素,然后放到已排序序列的...
根据提供的文件信息,我们可以深入探讨几种经典的排序算法:冒泡排序、直接插入排序、快速排序以及希尔排序。这些算法在数据结构与算法课程中是非常重要的基础内容,它们各自有着独特的特性和应用场景。 ### 1. ...
在计算机科学领域,排序算法是数据结构中至关重要的一部分,它涉及到如何有效地组织和排列一系列元素。本主题将详细探讨四种常见的排序算法:选择排序、插入排序、快速排序以及冒泡排序,它们都是用C语言实现的。...
排序算法如冒泡排序、选择排序、插入排序、快速排序、归并排序等,解决如何将无序数据变为有序的问题;查找算法如线性查找、二分查找,用于定位数据;图算法如深度优先搜索(DFS)和广度优先搜索(BFS),用于遍历图...
本资源聚焦于Python语言实现的各种排序算法,包括冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序以及堆排序。下面将详细解释这些排序算法的工作原理及其在Python中的实现。 1. **冒泡排序(Bubble ...