java - 具有相同迭代的两种不同冒泡排序方法的时间复杂度
问题描述
我正在实现一个冒泡排序算法,我很困惑下面给出的两个 java 方法是否会给出相同的时间复杂度或者会不同:
void bubbleSort(int arr[])
{
int n = arr.length;
for (int i = 0; i < n-1; i++)
{
for (int j = 0; j < n-i-1; j++)
{
if (arr[j] > arr[j+1])
{
// swap arr[j+1] and arr[j]
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
这种方法有 O(N^2) 时间复杂度——我很确定。
void bubbleSort(int arr[])
{
int n = arr.length;
int i=0,j=0;
while(i<n-1)
{
if (arr[j] > arr[j+1])
{
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
j++;
if(j==n-i-1)
{
j=0;
i++;
}
}
我不确定这个,因为它使用单循环进行相同的迭代?
解决方案
两种实现具有相同的复杂性,通过比较它们的迭代次数很容易看出。让我们在发生迭代的地方添加计数器,并在排序后比较它们的值:
class Main {
private static int count1 = 0, count2 = 0;
public static void main(String[] args) {
int[] array1 = new int[]{1, 6, -4, 0, 12, -8}, array2 = new int[]{1, 6, -4, 0, 12, -8};;
bubbleSort1(array1);
bubbleSort2(array2);
System.out.println(count1);
System.out.println(count2);
}
private static void bubbleSort1(int arr[]) {
int n = arr.length;
for (int i = 0; i < n-1; ++i) {
++count1;
for (int j = 0; j < n-i-1; ++j) {
++count1;
if (arr[j] > arr[j+1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
private static void bubbleSort2(int arr[]) {
int n = arr.length;
int i = 0, j = 0;
while (i < n - 1) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
++j;
++count2;
if (j == n - i - 1) {
j = 0;
++i;
++count2;
}
}
}
}
输出:
20
20
在复杂性评估中,重要的不是周期数,而是算法本身,这里也是 O(n^2)。
推荐阅读
- html - 带有 .input-group 的 Bootstrap 4 个浮动标签
- docx - Pandoc:生成的 DOCX 章节中节号不正确的问题
- c# - c# 泛型集合和接口的 OOD 问题
- google-cloud-platform - 具有单一 cloudbuild 的 Mono-repository 架构中的 Google Cloud Build 管道
- json - 如何在 Powershell 中扩展 JSON 字符串中的变量?
- java - 通过公共键值比较两个 Json 对象 - java 方法
- postgresql - 在 ubuntu 18.04 中安装 GDAL 后 postgis 无法正常工作
- swift - UIScrollView 约束意外行为
- ios - iOS 上的 Webview 渲染问题 [Testflight]
- laravel - 一般错误:1005 无法创建表 `chatbot`.`staistic_students`(错误号:150“外键约束格式不正确”)