排序小结(java实现 )

风控IV、AUC、KS python计算代码 df_temp:数据集,Y:是否逾期标签,feas_list:需要计算IV的 变量。2、 按月和不同Y 下的 IV计算。 阅读详情

java中的排序总结
1、冒泡排序(有m个数,就要进行m-1趟比较;在第j趟要进行m-j次两两比较)

static void bubbleSort(int[] array)
{
        int temp;
        int flag=0;//设置标志,如果第一次循环比较时没有发生交换,则说明数组是升序排序,不用排序,提前结束循环
        for(int i=0;i<array.length-1;i++)//外层循环控制循环次数
        {
            for(int j=0;j<array.length-1-i;j++)//内层循环控制每次循环里的比较次数
            {
                if(array[j]>array[j+1])
                {
                    temp=array[j];
                    array[j]=array[j+1];
                    array[j+1]=temp;
                    flag=1;
                }   
            }

        if(flag==0)
        {
            System.out.println("No Sort\n");
            break;
        }
    }       
}   

2、选择排序

 void selectionsort(int[] a)
 2     {
 3         int i,j;
 4         int k;
 5         int tmp;
 6
 7         for(i = 0; i < a.length-1; i++)//控制循环次数,m个数需要m-1次循环
 8         {
 9             k = i;
10             for(j = i+1; j < a.length; j++)
11             {
12                 if(a[j] < a[k])
13                     k = j;
14             }
15             //i不等于k是就证明a[i]不是最小的,
16             //i等于k时证明a[i]就是本轮比较过程中最小的值
17             if(i != k)
18             {
19                 tmp = a[i];
20                 a[i] = a[k];
21                 a[k] = tmp;
22             }
23         }
24   }

3、插入排序(比较适合少量元素的数组,至少比冒泡排序要快)
插入排序由n-1趟排序组成,对于p=1到n-1趟,插入排序保证从位置0到位置p上的元素为已排序状态。

public static void insertSort(int[] a)
{
    int j;
    for(int p=1;p<a.length;p++)
    {
        int tmp=a[p];
        for(j=p;j>0&&tmp.compareTo(a[j-1])<0;j--)
        {
            a[j]=a[j-1];
        }
        a[j]=tmp;
    }
}

4、希尔排序(也称为缩减增量排序)
它通过比较相距一定间隔的元素来工作,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。

//使用希尔增量的希尔排序

public static void shellSort(int[] a)
{
    int j;
    for(int gap=a.length/2;gap>0;gap/=2)
    {
       for(int i=gap;i<a.length;i++) 
       {
            int tmp=a[i];
            for(j=i;j>=gap&&tmp.compareTo(a[j-gap])<0;j-=gap)
                a[j]=a[j-gap];
            a[j]=tmp;
       }
   }
}

5、堆排序
先建立n个元素的二叉堆,将花费O(n)的时间,然后执行n次deleteMin操作。按照顺序,最小的元素将离开堆。通过将这些元素记录到第二个数组然后再将数组拷贝回来,得到n个元素的顺序。每次deleteMin操作将花费时间O(logn),因此总的运行时间是O(nlogn)。为了避免使用一个附加的数组,在每次使用deleteMin之后,堆缩小1。因此,位于堆中最后的单元可以用来存放刚刚删去的元素。

//将堆中指定序号的两个元素交换
private void swapReferences(int[] a,int b,int c)
{
    int temp;
    temp=a[b];
    a[b]=a[c];
    a[c]=temp;
}

//获取节点的左孩子在数组中的位置(数组下标从0开始)
private static int leftChild(int i)
{
    return 2*i+1;
}

//下滤:建大顶堆及删除堆顶的最大值
private static void percDown(int[] a,int i,int n)
{
    int child;
    int tmp;
    for(tmp=a[i];leftChild(i)<n;i=child)    
    {
        child=leftChild(i);
        if(child!=n-1&&a[child].compareTo(a[child+1]))
            child++;
        if(tmp.compareTo(a[child])<0)
            a[i]=a[child];
        else
            break;
    }
    a[i]=tmp;
}

/**
*
*Standard heapSort
*/
public static void heapSort(int[] a)
{
    for(int i=a.length/2;i>=0;i--)//build MaxHeap
        percDown(a,i,a.length); 

    for(int i=a.length-1;i>0;i--)
    {
        swapReferences(a,0,i);//delete max
        percDown(a,0,i);
    }
}

6、归并排序
这个算法中基本的操纵是合并两个已排序的表,是经典的分治策略。它将问题分为一些小的问题然后递归求解,而治的阶段则将分的阶段解得的各答案修补在一起。分而治之是递归非常有效的用法。

private static void mergeSort(int[] a,int[] tmpArray,int left,int right)
{
    if(left<right)
    {
        int center=(left+right)/2;
        mergeSort(a,tmpArray,left,center);
        mergeSort(a,tmpArray,center+1,right);
        merge(a,tmpArray,left,center+1,right);
   }
} 

//
private static void merge(int[] a,int[] tmpArray,int leftPos,int rightPos,int rightEnd)
{
    int leftEnd=right-1;
    int tmpPos=leftPos;//
    int numElements=rightEnd-leftPos+1;//元素的个数
    //main loop
    while(leftPos<=leftEnd&&rightPos<=rightEnd)
    {
        if(a[leftPos].compareTo(a[rightPos])<=0)
            tmpArray[tmpPos++]=a[leftPos++];
        else
            tmpArray[tmpPos++]=a[rightPos++];
    }
    //copy rest of left half
    while(leftPos<=leftEnd)
        tmpArray[tmpPos++]=a[leftPos++];

    //copy rest of right half
    while(rightPos<=rightEnd)
        tmpArray[tmpPos++]=a[rightPos++];

    //copy tmpArray back
    for(int i=0;i<numElements;i++,rightEnd--)
        a[rightEnd]=tmpArray[rightEnd];
}

//mergeSort  algorithm
public static void mergeSort(int[] a)
{
    int[] tmpArray=new int[a.length];//开辟的一个临时数组,作为桥梁,长度为数组a的长度
    mergeSort(a,tmpArray,0,a.length-1);
}

7、快速排序

  1. 选取枢纽元
    枢纽元的最好选择是数组的中值,一般的做法是使用左端、右端和中心位置上 的三个元素的中值作为枢纽元。这样使用三数中值分割法消除了预排序输入的坏情形。
  2. 分割策略
    第一步:是通过将枢纽元与最后的元素交换使得枢纽元离开要被分割的数据段。
    第二步: i从第一个元素开始而j从倒数第二个元素开始。
    第三步:当i在j的左边,我们将i右移,移过那些小于枢纽元的元素,并将j左移,移过那些大于枢纽元的元素。当i和j停止时,i指向一个大元素而j指向一个小元素。如果i在j的左边,那么将这两个元素互换,其效果是把一个大元素推向右边而把一个小元素推向左边。重复以上过程直到i和j彼此交错为止。
    最后一步:是将枢纽元与i所指向的元素交换。

    具体算法的实施过程:
    我们可以把枢纽元放到a[right-1],并在分割阶段将i和j初始化为left+1和right-2。因为a[left]比枢纽元小,所以将它用作j的警戒标记,不必担心j跑过端点。将枢纽元存储在a[right-1]则也提供一个警戒标记。

//交换指定位置处的元素
private void swapReferences(int[] a,int b,int c)
{
    int temp;
    temp=a[b];
    a[b]=a[c];
    a[c]=temp;
}

//三数中值分割法选取枢纽元
private static int median3(int[] a,int left,int right)
{
    int center=(left+right)/2;

    if(a[center].compareTo(a[left])<0)//顺序不能错
        swapReferences(a,left,center);
    if(a[right].compareTo(a[left]<0)
        swapReferences(a,left,right);
    if(a[right].compareTo(a[center])<0)
        swapReferences(a,center,right);

    swapReferences(a,center,right-1);
    return a[right-1];
}

//快速排序的主程序
private static void quickSort(int[] a,int left,int right)
{
    if(left+CUTOFF<=right)//对于小数组不使用递归的快速排序,CUTOFF小于20
    {
        int pivot=median3(a,left,right);
        int i=left,j=right-1;
        for(;;)
        {
            while(a[++i].compareTo(pivot)<0){}
            while(a[--j].compareTo(pivot)>0){}
            if(i<j)
             swapReferences(a,i,j);
            else
             break; 
        }

        swapReferences(a,i,right-1);

        quicksort(a,left,i-1);
        quicksort(a,i+1,right);
    }
    else
        insertSort(a,left,right);//对于小数组使用插入排序
}

8、快速选择(基于快速排序的思想,只做一次递归调用,平均运行时间是O(N))

private static void quickSelect(int[] a,int left,int right,int k)
{
    if(left+CUTOFF<=right)
    {
        int pivot=median3(a,left,right);
        int i=left,j=rigth-1;
        for(;;)
        {
            while(a[++i].compareTo(pivot)<0){}
            while(a[--j].compareTo(pivot)>0){}
            if(i<j)
                swapReferences(a,i,j);
            else
                break;
        }

        swapReferences(a,i,right-1);

        if(k<=i)
            quickSelect(a,left,i-1,k);
        else if(k>i+1)
            quickSelect(a,i+1,right,k);
        else
            insertSort(a,left,right);
    }
}

9、桶式排序(计数排序)
桶式排序不再是基于比较的排序,待排序列满足以下两个特征:
1)待排序列所有的值处于一个可枚举的范围之内(只能是整形数组)
2)待排序列所在的这个可枚举的范围不应该太大,否则排序开销比较大(当K较大,而数组长度n较小,即K>>n时,辅助数组C[K+1]的空间消耗较大)
当数组为整型,且k和n接近时,可以用此方法排序
桶式排序需要两个数组,第一个buckets数组用于记录“落入”各桶中元素的个数,进而保存各元素在有序序列中的位置,第2个数组用于缓存待排数据;
如果待排序数据的范围在0~K之间,那么它的时间复杂度是O(k+n)

public class BucketSortTest
{
    public static int count=0;
    public static void main(String[] args)
    {
        int[] data=new int[]{5,3,6,2,1,9,4,8,7};
        bucketSort(data,0,10);
    }

    public static void bucketSort(int[] data,int min,int max)
    {
        //缓存数组
        int[] tmp=new int[data.length];

        //buckets用于记录待排序元素的信息,定义了max-min个桶
        int[] buckets=new int[max-min];

        //计算每个元素在序列中出现的次数
        for(int i=0;i<data.length;i++)
            buckets[data[i]-min]++;

        //计算“落入”各桶内的元素在有序序列中的位置
        for(int i=1;i<max-min;i++)
        {
            buckets[i]=buckets[i]+buckets[i-1];
        }
        //将data中的元素完全复制到tmp数组中
        System.arraycopy(data,0,tmp,0,data.length);

        //根据buckets数组中的信息将待排序的各元素放入相应的位置
        for(int k=data.length-1;k>=0;k--=)
            data[--buckets[tmp[k]-min]]=tmp[k];
    }
}
深入详解DICOM医学影像定位线相关知识:理解定位线的概念、定位线的作用以及定位线显示和计算原理 阅读详情

相关推荐

新手也能懂的Simulink汽车二自由度建模:从公式推导到模型搭建全流程

本文为新手提供了在Simulink中搭建汽车二自由度模型的完整实战指南。文章从模型核心概念讲起,详细讲解了如何将车辆动力学方程转化为状态空间模型,并逐步指导在Simulink中实现从参数设置、模块搭建到仿真验证的全过程。通过阶跃转向测试和参数影响分析,帮助读者直观理解车辆转向特性,并提供了实用的模型扩展思路与常见问题排查技巧。

weixin_29047919的博客 213

java数组用for排序_简单for循环进行数组排序

标签:import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.Scanner;import java.util.Arrays;public class Triangle{public static void main(String[] arg...

weixin_39520204的博客 521

Keil5芯片包下载后无法识别?手把手排查教程

遇到Keil5芯片包下载后不被识别的问题别慌,常见原因包括安装路径错误或包未正确注册。通过检查Pack Installer状态和手动更新设备支持列表,轻松排查故障,确保开发环境正常运行。

weixin_35459464的博客 878

[数据结构与算法] : 排序

1 /* This file contains a collection of sorting routines */ 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include "fatal.h" 5 6 typedef int ElementType; 7 8 void...

weixin_30832983的博客 174

sift、surf、orb 特征提取——三维重建

参考文章:[sift、surf、orb 特征提取及最优特征点匹配] 最近刚刚入门三维重建,在SFM算法的代码中注意到了feature_type( feature extraction method)这个参数,想细致了解一下这几种特征提取算法,在这里做一下笔记。 SIFT 简介 SIFT(Scale-Invariant Feature Transform)——尺度不变特征变换,是一种计算机视觉的特征提取算法,用来侦测与描述图像中的局部特征。 实质上,它是在不同的尺度空间上查找关键点(特征点),并计算出关键点的

bb_sy_w的博客 4362

【SIP基础】SIP协议基本呼叫流程

SIP呼叫流程下图显示了一个SIP会话的基本呼叫流程。 下面是上述呼叫流程的详细解释: Alice发送INVITE请求到代理服务器,INVITE请求负责发起会话。 代理服务器立即发送Trying 100给请求者(Alice),表示试图响应INVITE请求,以防止重传该INVITE请求。 代理服务器搜索Bob所在位置服务器的地址,得到的地址后,将转发INVITE请求到Bob。 此后,Bob回应180

VVSIP官网博客 1万+

Java 排序算法-冒泡排序及其优化

Java 排序算法-冒泡排序及其优化 Java 排序算法-冒泡排序及其优化什么是冒泡排序基本写法优化后写法终极版本源码及测试 什么是冒泡排序 这里引用一下百度百科上的定义: 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经...

qq_39827033的博客 1909

遗传算法(GA)全面解析:从生物基础到工程实践

本文全面解析了遗传算法(GA),从其生物基础到工程实践应用。遗传算法模拟自然进化过程,通过选择、交叉和变异等操作在解空间中高效搜索最优解。文章详细介绍了算法的生物学基础(达尔文进化论、孟德尔遗传定律)、基本概念(种群、个体、基因等)和核心思想。重点阐述了遗传算法的数学模型,包括编码机制、适应度函数设计、遗传算子(选择、交叉、变异)以及关键控制参数。最后提供了一个完整的Python实现示例,展示了遗传算法求解函数最大值问题的具体应用。该算法具有群体搜索、概率导向、无需梯度等特点,适用于各类复杂优化问题。

qq_42212808的博客 1175

常用排序算法之堆排序

堆排序 基本思想: 要进行堆排序,首先要建立N个元素的二叉堆,建立好二叉堆后,我们执行N次DeleteMin操作。按照顺序,最小的元素最先离开该堆,通过将这些元素记录到第二个数组然后再将数组拷贝回来,即可得到N个元素的排序。 涉及到堆,就一定要保持堆的性质:(结构性质、堆序性质) 结构性质:堆是一颗被完全填满的二叉树,有可能的例外是在底层,底层上的元素从左到右填入。这样

mazi的博客 847

PCL Alpha Shapes平面点云边界特征提取【2026最新版】

alpha shapes算法用于平面点云的边界特征提取。博客长期更新,本文最近一次更新时间为:2026年4月20日。

点云侠的博客 27万+

uniapp - 解决在线预览PDF文件空白打不开的问题,无论是后端下载二进制文件流pdf还是本地插件或JS预览查看打开白屏不显示,详细排查解决(适用于移动端H5网页、安卓/苹果app、微信小程序)

uniapp App端 实现pdf文件预览打开白屏解决,uniapp 在线预览pdf打开一片空白,跨域白屏,uni-app中使用WebView预览PDF文件打开空白,微信小程序(uniapp)预览PDF空白怎么办,下载PDF文件流后打开空白或无法打开的问题,Uniapp H5网页下载二进制pdf文件页面空白以及解决文件损坏打不开的情况,Uniapp app在线预览pdf文件流,PDF加载出来怎么办,服务器后端返回PDF文件流后前端进行下载但打开后一片白屏,解决pdf文件流,预览全是空白页,pdf文件流,下载

🏆 前端领域优质创作者 1万+

数组排序(插入、选择、希尔、堆、归并、快速、冒泡)

插入排序如下,详细说明见注释: void InsertSort(int A[], int N) { int P, j, tmp; //P为待插入元素的下标,j为待插入元素应该插入的位置, tmp用来保存待插入元素的数值 for (P=1; P<N; P++) { tmp = A[P]; for (j=P; j>0&&A[j-1]>tmp; j--)

wusecaiyun的专栏 437

车载以太网-组播

车载以太网-组播

天赐好车的博客 251

排序算法小结(三)——选择类排序(Java实现):简单选择排序、树形选择排序、堆排序

排序算法小结(三)——选择类排序(Java实现):简单选择排序、树形选择排序、堆排序

xx2014301318的博客 267

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java基础-数组插入排序算法和冒泡排序算法的实现小结

一、插入算法的步骤:先将旧数组a排序,再复制一个长度(a.length+1)--(排序:Arrays.sort(旧数组a);复制:Arrays.copyOf(旧数组a, a.length+1));for循环遍历找出要插入的位置,int a =index;for循环将从index--&gt;新数组长度的元素后移;将要插入的值赋给a[index];实现代码如下:public class ArraysT...

Alicia0925的博客 753

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

排序算法小结(五)——在线性时间内排序(Java实现):计数排序、基数排序。

1.计数排序 一文弄懂计数排序算法! 2.基数排序

xx2014301318的博客 307

算法入门---java语言实现的冒泡排序小结

package com.zy.algorithm;public class BubbleSort { /** * 冒泡排序 顾名思义:每次比较两个数,然后当顺序有错误的时候进行交换。 * 这样看起来就是慢慢的把最小的冒出水面。 * 算法实现:也是通过两层for循环进行,最外层的for循环每执行一次就会把 最小的气 * 泡冒到前面(前面这些是已经排好序的),然后

宇你有缘 656

排序算法小结(四)——归并排序(Java实现)

排序算法小结(四)——归并排序

xx2014301318的博客 315

排序算法小结(二)——交换类排序(Java实现):冒泡排序、快速排序

排序算法小结(二)——交换类排序(Java实现):冒泡排序、快速排序

xx2014301318的博客 205

常用排序算法小结(附Java实现)

常用排序算法小记 排序算法很多地方都会用到,近期又重新看了一遍算法,并自己简单地实现了一遍,特此记录下来,为以后复习留点材料。 废话不多说,下面逐一看看经典的排序算法: 1. 选择排序 选择排序的基本思想是遍历数组的过程中,以 i 代表当前需要排序的序号,则需要在剩余的 [i…n-1] 中找出其中的最小值,然后将找到的最小值与 i 指向的值进行交换。因为每...

大海 112

java实现插入选择冒泡归并排序小结

冒泡排序:     从第一个数开始往后比若比后面的数大则交换,依次两两比较直到把最大的数排到最右边,称为第一趟冒泡排序,在重复上述过程即可。    时间复杂度O(N^2), 最好时间复杂度O(N^2),最差时间复杂度O(N^2),额外空间复杂度O(1),实现可以做到稳定性。比如待排序列(651703):    第一趟排序:561703---&gt;516703---&gt;516073---&gt...

凌峰的博客 217

算法入门---java语言实现的选择排序小结

public class SelectionSort { /** * 选择排序。 顾名思义:先选择再排序。 假如一个序列完全未排序其为A(0.....n) * 然后就从此序列中依次的选择然后排序。 * 先找到最大(小)的数,放在第一个位置为已排序序列B(1)。然后从未排序的序列中 * C(2....n)再找到最大的数放到已排序的序列的尾端。依次循环的进行. 算

宇你有缘 460

排序算法小结(转)

排序算法小结 排序小结    排序算法是一种基本并且常用的算法。由于实际工作中处理的数量巨大,所以排序算法对算法本身的速度要求很高。    而一般我们所谓的算法的性能主要是指算法的复杂度,一般用O方法来表示。在后面我将给出详细的说明。    对于排序的算法我想先做一点简单的介绍,也是给这篇文章理一个提纲。    我将按照算法的复杂度,从简单到难来分析算法。    第一部分是简单排序算法,后面你

为理想而奋斗 956

算法入门---java语言实现的堆排序小结

1、概述。      HeapSort 堆排序:利用二叉堆这种数据结构来进行设计的一种排序算法,可以利用数组的特点快速定位指定索引的元素。      此处先了解几个基本概念:      二叉树:是树的一种,主要的特点是二叉树的所有节点最多只有两个叶节点。      完全二叉树:就是在二叉树当中,除了最后一层之外,其它所有层的节点都是满的,且最后一层的节点也是从左到右,优  

宇你有缘 201

算法入门---java语言实现的插入排序小结

public class InsertSort { /** *你想啊,每个的前面都是比它小的,这样的组合肯定是有序的啊,细分到最小,每一个都需要遵守规则, * 这样就保证了前面的所有的,即使没和我挨着那么也是都比我小的。 * 插入排序的思想: * 元素从前往后,第一个元素排在它应该排的位置,然后去遍历第二个元素插入到它合适的位置, * 然后依次

宇你有缘 489
上一篇: java变量的初始化顺序小结
下一篇: 二叉查找树和二叉堆的分析小结
c1925363518
博客等级 码龄11年 4粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值