数组排序是大家经常遇到的问题,从面试,工作中各个情况遇到的时候很多,往往遇到排序,首先想到的是冒泡,可能冒泡排序的时间复杂性是O的两次幂,性能很差,对于小数组排序还算可以,但是大数据比较性能就不敢恭维了
今天要给大家讲的是一个其他的办法-----------------------二分查找。。。思路是循环数组,每次循环到i的位置的时候,就认为i前面的数组是已经排序过的,然后将i对应的数值插入到i之前的位置,难点就是找到位置,每次选择i的二分之一的位置进行比较,快速定位,也就是说如果i是1024,那么只需要快速定位10次,而且是最糟糕的情况,查到i对应的位置k后,将(k-1)---- i 位置顺移,将i位置的数值放到k的位置,依次继续。。。。。直接上代码吧
package suanfa; import java.util.Random; public class WZGL { public static void main(String[] args) { int num = 100000; int intC[] = new int[num]; int value1=0; for (int i = 0; i < num; i++) { value1 += new Random().nextInt(num); intC[i] = value1; } int intA[] = new int[num]; System.arraycopy(intC, 0, intA, 0, num); long time1 = System.currentTimeMillis(); paixu(intC); long time2 = System.currentTimeMillis(); for (int i = 1; i < intA.length; i++) { int index = findIndex(intA[i], 0, i - 1, intA); int value = intA[i]; System.arraycopy(intA, index, intA, index + 1, i - index); intA[index] = value; } long time3 = System.currentTimeMillis(); System.out.println(time2 - time1); System.out.println(time3 - time2); } // 冒泡排序 public static void paixu(int[] iaaa) { for (int i = 0; i < iaaa.length; i++) { for (int j = i + 1; j < iaaa.length; j++) { if (iaaa[j] < iaaa[i]) { int aa = iaaa[i]; iaaa[i] = iaaa[j]; iaaa[j] = aa; } } } } //二分查找排序 public static int findIndex(int thisval, int from, int to, int[] thissz) { int index = 0; if (thissz[from] >= thisval) { index = from; return index; } if (thissz[to] <= thisval) { index = to + 1; return index; } if (to - from == 1) { return to; } int zhongjian = (to - from) / 2 + from; if (thissz[zhongjian] >= thisval) { return findIndex(thisval, from, zhongjian, thissz); } else { return findIndex(thisval, zhongjian, to, thissz); } } }
100000条数据的性能比较:
5749
438
当然数据越大,越明显,测试过100万条数据的比较,二分查找大约40秒,冒泡排序基本就卡着不动了。。。。
相关推荐
在学习这个程序时,可以关注以下几个点: 1. 如何定义和初始化数组? 2. 如何实现冒泡排序的两层循环结构? 3. 如何判断并处理未发生交换的情况,以优化算法性能? 4. 控制台输出如何显示排序过程或最终结果? 这个...
3进一步改进的冒泡排序,如果在某次冒泡过程中,最后一次进行交换的位置为flag,则表示flag之后的序列已经有序,那么下一次冒泡就无需比较flag之后的序列,即只要比较到flag就可以结束此次冒泡过程。当flag=0时,...
在实际应用中,冒泡排序算法的C++函数模板可以在许多领域中发挥重要作用,例如数据分析、科学计算、机器学习等。在这些领域中,快速、高效的排序算法可以大大提高计算速度和降低计算成本。 冒泡排序算法的C++函数...
3. **内层循环**:对于每趟排序,从最后一个元素开始向前比较,如果前一个元素比后一个元素大,则交换这两个元素的位置,并且将 `NoSwap` 设置为 `False`,表示发生了元素交换。 4. **检查标志位**:在每趟排序结束...
冒泡排序是一种基础且经典的排序算法,...在实验3中,你不仅需要实现冒泡排序,还应该尝试分析和理解它的时间和空间复杂度,以及讨论其在不同情况下的优缺点。通过实践,你可以加深对排序算法的理解,并提升编程能力。
插入排序是一种简单的排序算法,它的基本思想是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。在C++中,可以使用两层循环实现,外层循环控制未排序部分,内层循环寻找插入...
在探讨C++冒泡排序这一知识点时,我们不仅会深入理解冒泡排序的基本原理、算法实现,还会细致分析如何在C++中灵活运用该算法进行数据的升序或降序排列。冒泡排序是一种简单的排序算法,其基本思想是通过重复地走访待...
js冒泡排序js冒泡排序js冒泡排序js冒泡排序js冒泡排序js冒泡排序js冒泡排序js冒泡排序js冒泡排序js冒泡排序js冒泡排序js冒泡排序js冒泡排序js冒泡排序js冒泡排序js冒泡排序js冒泡排序js冒泡排序js冒泡排序js冒泡排序...
冒泡排序详解,简单而详细的讲清楚了,什么是冒泡排序。 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首...
在数字电路设计中,Verilog是一种被广泛使用的硬件描述语言(HDL)。它允许工程师使用文本描述来设计复杂的电子系统,这些系统随后可以通过硬件综合过程转换成实际的电路。冒泡排序是一种基础的计算机排序算法,它的...
你需要在CDialog的DoDataExchange函数中处理数据输入,然后在按钮的点击事件处理函数中执行冒泡排序和结果显示。 通过这个MFC实现的冒泡排序,我们可以学习到如何结合MFC的控件和事件处理机制来实现用户交互,同时...
冒泡排序法是一种基础但重要的排序算法,尤其在学习数据结构和算法的初期阶段,它为理解排序原理提供了直观的示例。C++是广泛应用于系统编程、应用编程、游戏开发等多个领域的强大编程语言,因此用C++实现冒泡排序是...
初学LabelView写的冒泡排序。 随机产生数组元素,并进行冒泡排序。
冒泡排序和选择排序是两种基础的排序算法,在计算机科学中有着广泛的应用,尤其是在学习编程语言如C语言时,理解并能实现这两种排序算法是非常重要的。下面将详细讲解这两种排序方法以及它们在C语言中的实现。 **...
冒泡排序属于比较排序算法,其在实现时使用了简单的双层循环来完成排序操作。在每一轮遍历中,算法会比较相邻的两个元素,如果顺序错误(即前一个数大于后一个数),就将这两个数进行交换。通过这种方式,每一遍的...
这个程序不仅会进行排序,还会以动画的形式展示排序的过程,帮助用户直观地理解冒泡排序的工作原理。 首先,我们要理解冒泡排序的基本思想。冒泡排序的基本操作是对比相邻的两个元素,如果它们的顺序错误(即前者...
以下是使用Python语言实现的冒泡排序示例代码: ```python def bubble_sort(arr): n = len(arr) # 遍历所有数组元素 for i in range(n): # 最后i个元素已经就位 for j in range(0, n-i-1): # 如果当前元素...
在实际应用中,冒泡排序效率较低,时间复杂度为O(n^2),对于大数据量或性能要求高的场景,通常会选择其他更高效的排序算法,如快速排序、归并排序或堆排序等。然而,由于其简单易懂,冒泡排序在教学和理解排序算法...
冒泡排序是一种基础的排序算法,它通过重复遍历待排序的序列,比较相邻的元素并根据需要交换它们,直到序列变得有序。本题涉及多个关于冒泡排序及其变种的应用题目。 1. 第一段代码段是冒泡排序的一个简化版本,只...
冒泡排序是一种基础且经典的排序算法,它通过不断交换相邻两个元素的位置,使得每一次遍历都能将当前未排序部分的最大(或最小)元素“冒”到已排序部分的末尾。在Java编程语言中,我们可以很容易地实现这个算法。...