我们工作时候处理数据时候会遇到一些处理数据排序的问题。这里我说两种比较常用的方法:一、冒泡排序法。二、归并排序法。
首先来说一下 冒泡排序法:这个方法大家应该还是比较熟悉的。核心思想是下面的一段代码——————
for(int i=1;i<list.length;i++){
for(int j=0;j<list.lenght-i;j++){
if(list[j]>list[j+1]){
swap list[j] with list[j++]
}
}
}
这是核心代码段,思想就是从数组的第一个数据开始和后面比较小的不动,大的后移。直到循环结束。有时候会觉得这个比较耗时间的,其实我们可以稍微的改进一下,在某些情况下会提高不少效率。例子如下:
/*
冒泡排序法
*/
public class BubbleSort
{
public static void main(String[] args)
{
//System.out.println("Hello World!");
int[] list = {7,4,8,2,5,9,-1,38,3};
bubbleSort(list);
for(int i=0;i<list.length;i++){
System.out.println(list[i]);
}
}
public static void bubbleSort(int[] list){
boolean needNextPass = true;
for(int i = 1;i< list.length && needNextPass;i++){
for(int j=0;j<list.length-i;j++){
if(list[j]>list[j+1]){
int tmp = list[j];
list[j] = list[j+1];
list[j+1] = tmp;
needNextPass = true;
}
}
}
}
}
上面的这个例子只是加一个参数来判断,但是由于这个参数,会在大多数的情况下,使程序的效率大大的提高了。
然后我们来说一下一个大家可能不是很熟悉的 归并排序法。核心思想就是二分法:
具体代码如下
/*
归并排序
*/
public class MergeSort
{
public static void main(String[] args)
{
int[] list = {2,3,2,5,6,1,-2,3,14,12};
mergeSort(list);
for(int i=0;i<list.length;i++){
System.out.print(list[i]+" ");
}
}
//迭代分组
public static void mergeSort(int[] list){
if(list.length>1){
int[] firstHalf = new int[list.length/2];
System.arraycopy(list,0,firstHalf,0,list.length/2);
mergeSort(firstHalf);
int secondHalfLength = list.length - list.length/2;
int[] secondHalf = new int[secondHalfLength];
System.arraycopy(list,list.length/2,secondHalf,0,secondHalfLength);
mergeSort(secondHalf);
int[] temp = merge(firstHalf,secondHalf);
System.arraycopy(temp,0,list,0,temp.length);
}
}
//合并数组
public static int[] merge(int[] list1,int[]list2){
int[] temp = new int[list1.length+list2.length];
int current1 = 0;
int current2 = 0;
int current3 = 0;
while(current1<list1.length && current2<list2.length){
if(list1[current1]<list2[current2]){
temp[current3++] = list1[current1++];
}else{
temp[current3++] = list2[current2++];
}
}
while(current1<list1.length){
temp[current3++] = list1[current1++];
}
while(current2<list2.length){
temp[current3++] = list2[current2++];
}
return temp;
}
}
效率的话 我就简单的将结果说一下,因为具体测试效率是有一套测试的,具体可以自己去网上找找;
归并的效率高于冒泡的效率。
分享到:
相关推荐
# 国家集训队论文列表(1999-2019) ... - _国家集训队论文列表(1999-2019)_ ...杨 弋 -《从“小H的小屋”的解法谈算法的优化》 朱晨光 -《浅析倍增思想在信息学竞赛中的应用》 李羽修 -《Hash函数的设计优化》 ...
本篇文章将围绕《浅谈程序设计竞赛的算法知识》这一主题展开讨论,重点解析竞赛中常见的算法知识及其应用场景。 #### 二、程序设计竞赛中考核的算法知识 1. **AdHoc(杂题)** - 特点:通常没有固定解法,需要...
在《计算机算法浅谈》这一文档中,作者骆吉洲教授从哈尔滨工业大学的计算机科学与工程系出发,深入浅出地介绍了算法的基本概念及多种重要的算法类型。 ### 算法基本概念 算法是指解决问题的一系列明确、有限步骤的...
快速排序算法是计算机科学中一种广泛应用的排序算法,其基本原理是基于分治法。快速排序算法相较于冒泡排序有着更高的效率,主要体现在其平均情况下的时间复杂度和原地排序的特点。快速排序在进行元素比较和交换的...
插入排序是一种基础且直观的排序算法,其工作原理类似于打扑克牌时整理手牌的过程。在Python中,插入排序可以通过创建一个已排序的部分和一个未排序的部分来实现。当未排序部分的元素与已排序部分的元素进行比较并...
2路插入排序是一种改进的插入排序算法,它在直接插入排序的基础上增加了辅助数组,目的是减少数据元素在原数组中的移动次数。直接插入排序在插入新元素时,可能会导致已排序部分的元素频繁后移,而2路插入排序通过...
典型的分治算法有快速排序、归并排序和大整数乘法等。 2. 动态规划算法:它通过将问题分解为相互重叠的子问题来求解,保存子问题的解以避免重复计算。经典的动态规划问题包括最短路径问题、背包问题和最长公共子...
今天我们要浅谈的主题是“树”,这是一种非常重要的数据结构,特别是在动态获取信息时,如从数据库中读取数据。树结构能够有效地帮助我们管理和操作数据,提高程序的性能。 首先,我们需要理解什么是“树”。在...
而插入排序则是将待排序序列分成已排序和未排序两部分,不断将未排序部分的元素插入到已排序部分的适当位置。 调整思想不仅适用于解决排序问题,而且在图论中也有广泛的应用。在解决最短路径问题时,比如Dijkstra...
涵盖内容包括但不限于算法复杂度评估、单链表的操作、各类字符串匹配方法(例如Boyer-Moore)、图的各种遍历技术、多种常见的排序技巧(像冒泡排序、快速排序、希尔排序等)、以及诸如Huffman树这样的实用结构。...
《浅谈几类背包题》是由徐持衡撰写的一篇关于算法解题的文章,主要针对ACM(国际大学生程序设计竞赛)中常见的背包问题进行深入探讨。在这篇文章中,徐持衡老师详细讲解了几种经典的背包问题及其解题策略,包括0-1...
标题中的“算法文档无代码正难则反–浅谈逆向思维在解题中的应用(2)”暗示了这篇文章可能属于算法教育类内容,并且将探讨如何在解决算法问题时采用逆向思维的方法。这里需要解释的几个关键词是“算法”、“无代码”...
这道算法题太简单啦额,又是一个要求装逼解法的算法题两道简单的套公式算法题杨辉三角浅谈什么是动态规划以及相关的「股票」算法题好吧,又是两分钟的时间观察这个投机取巧的算法题LeetCode 第94号问题二叉树的中序...
例如,在排序问题中,正向思维可能会关注如何构建排序算法的步骤,而逆向思维则可能从期望的排序结果出发,反向推导出排序过程中的关键操作。 3. 检测与调试:逆向思维在程序的测试和调试阶段同样发挥着重要作用。...
为了提高效率,可以考虑使用更高效的排序算法,或者在数据加载到`ListView`之前对其进行预排序。 ### 结论 通过上述步骤,我们不仅能够实现`ListView`在WinForm应用中按列头点击进行排序的功能,还能够进一步扩展...
### 浅谈PHP冒泡排序 #### 一、冒泡排序简介 冒泡排序是一种简单的排序算法,它重复地遍历待排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复进行的,直到没有再需要交换...