掌握常见的内部排序方法(插入排序,冒泡排序,选择排序,快速排序,堆排序,希尔排序,归并排序,基数排序等)...

掌握常见的内部排序方法(插入排序,冒泡排序,选择排序,快速排序,堆排序,希尔排序,归并排序,基数排序等)。
数组高级以及Arrays(掌握)
排序方法
空间复杂度
时间复杂度
稳定性
直接插入排序
O1
平均On2
最坏On2
最好On
稳定
折半插入排序
O1
平均Onlogn
最坏On2
稳定
希尔排序
O1
平均On2
不稳定
           冒泡排序
O1
平均On2
最坏On2
最好On
稳定
           快速排序
平均Onlogn
最坏On
平均Onlogn
最坏On2
平均Onlogn
不稳定
           简单选择排序
O1
始终On2
不稳定
           堆排序
O1
平均Onlogn
建堆On
调整Ologn
不稳定
归并排序
On
Onlogn
稳定
基数排序
Od(n+r)
Od(n+r)
稳定
(1)排序
A:冒泡排序
     相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处。同理,其他的元素就可以排好。
          
       public static void bubbleSort(int[] arr) {
         for(int x=0; x<arr.length-1; x++) {
           for(int y=0; y<arr.length-1-x; y++) {
              if(arr[y] > arr[y+1]) {
               int temp = arr[y];
                arr[y] = arr[y+1];
               arr[y+1] = temp;
                   }
                }
              }
           }         
B:选择排序
           把0索引的元素,和索引1以后的元素都进行比较,第一次完毕,最小值出现在了0索引。同理,其他的元素就可以排好。
          
       public static void selectSort(int[] arr) {
           for(int x=0; x<arr.length-1; x++) {
             for(int y=x+1; y<arr.length; y++) {
                  if(arr[y] < arr[x]) {
                    int temp = arr[x];
                    arr[x] = arr[y];
                    arr[y] = temp;
                     }
                 }
              }
           }
C.插入排序算法:
public static void insertSort(int[] arr) {
      for (int i = 1; i < arr.length; i++) {
          if(arr[i]<arr[i-1]){
           arr[0]=arr[i];
          for(int j=i-1;arr[0]<arr[j];j--)//只要arr[i]大的都后移,找到arr[i]合适的插入位置
           arr[j+1]=arr[j];
        arr[j+1]=arr[0];
            }
        }
    }
D希尔排序:
/*
* 希尔排序:先取一个小于n的整数d1作为第一个增量,
* 把文件的全部记录分成(n除以d1)个组。所有距离为d1的倍数的记录放在同一个组中。
* 先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,
* 直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
*/
public class ShellSort {
public static void sort(int[] data) {
for (int i = data.length / 2; i > 2; i /= 2) {//设置增量
for (int j = 0; j < i; j++) {
insertSort(data, j, i);
}
}
insertSort(data, 0, 1);
}
private static void insertSort(int[] data, int start, int inc) {
for (int i = start + inc; i < data.length; i += inc) {
for (int j = i; (j >= inc) && (data[j] < data[j - inc]); j -= inc){
SortTest.swap(data, j, j - inc);
}
}
}
}
E.快速排序:
Void Quicksort(int A[],int low,int high){
  If(low<high){
      Int pivotpos= partion(A, low ,high);//获取枢轴数位置
      Quicksort(A,  low,pivotpos-1);
Quicksort(A,pivotpos-1,high)
}
}
Int partion(int A[],int low ,int high){
   Int pivot=Alow];
  While(low<high){
While(low<high&&A[high]>=pivot)  high--;//从枢轴小的左移
       A[low]=A[high];
While(low<high&&A[low] <=pivot) low++;//从枢轴大的右移
      A[high] =A[low];
 A[low]=pivot;     //枢轴最后存放的位置
   return low;
   }
}
F:归并排序:
public static int[] sort(int[] a,int low,int high){
        int mid = (low+high)/2;
        if(low<high){
            sort(a,low,mid);//分成两个子序列,分别递归排序
            sort(a,mid+1,high);
            //左右归并
            merge(a,low,mid,high);
        }
        return a;
    }
//将两个有序表合并成一个有序表
   public static void merge(int[] a, int low, int mid, int high) {
        int[] temp = new int[high-low+1];//定义一个数组
        int i= low;
        int j = mid+1;
        int k=0;
        // 把较小的数先移到新数组中
        while(i<=mid && j<=high){
            if(a[i]<a[j]){
               temp[k++] = a[i++];
            }else{
               temp[k++] = a[j++];
            }
        }
        // 把左边剩余的数移入数组 
        while(i<=mid){
            temp[k++] = a[i++];
        }
        // 把右边边剩余的数移入数组
        while(j<=high){
            temp[k++] = a[j++];
        }
        // 把新数组中的数覆盖nums数组
        for(int x=0;x<temp.length;x++){
          a[x+low] = temp[x];//原数组从low开始的
        }
    } 
G:堆排序
//构建大根堆:将array看成完全二叉树的顺序存储结构
    private int[] buildMaxHeap(int[] array){
//从最后一个节点array.length-1的父节点(array.length-1/2开始,直到根节点0,反复调整堆
         for(int i=(array.length-1)/2;i>=0;i--){
              adjustDownToUp(array, i,array.length);
          }
          return array;
      }
     
//将元素array[k]自下往上逐步调整树形结构
     private void adjustDownToUp(int[] array,int k,int length){
         int temp = array[k];  
         for(int i=2*k; i<length; i=2*i){    //i为初始化为节点k的左孩子,沿节点较大的子节点向下调整
             if(i<length && array[i]<array[i+1]){  //取节点较大的子节点的下标
                 i++;   //如果节点的右孩子>左孩子,则取右孩子节点的下标
            }
             if(temp>=array[i]){  //根节点 >=左右子女中关键字较大者,调整结束
                 break;
             }else{   //根节点 <左右子女中关键字较大者
                 array[k] = array[i];  //将左右子结点中较大值array[i]调整到双亲节点上
                k = i; //【关键】修改k值,以便继续向下调整
             }
         }
        array[k] = temp;  //被调整的结点的值放人最终位置
    }   
//堆排序
      public int[] heapSort(int[] array){
          array = buildMaxHeap(array); //初始建堆,array[0]为第一趟值最大的元素
          for(int i=array.length-1;i>1;i--){ 
             int temp = array[0];  //将堆顶元素和堆低元素交换,即得到当前最大元素正确的排序位置
              array[0] = array[i];
             array[i] = temp;
            adjustDownToUp(array, 0,i-1);  //整理,将剩余的元素整理成堆
         }
         return array;
    }
(2)查找
      A:基本查找
           针对数组无序的情况
          
           public static int getIndex(int[] arr,int value) {
              int index = -1;
             
              for(int x=0; x<arr.length; x++) {
                  if(arr[x] == value) {
                     index = x;
                     break;
                  }
              }
             
              return index;
           }
       B:二分查找(折半查找)
           针对数组有序的情况(千万不要先排序,在查找)
          
           public static int binarySearch(int[] arr,int value) {
              int min = 0;
              int max = arr.length-1;
              int mid = (min+max)/2;
             
              while(arr[mid] != value) {
                  if(arr[mid] > value) {
                     max = mid - 1;
                  }else if(arr[mid] < value) {
                     min = mid + 1;
                  }         
                  if(min > max) {
                     return -1;
                  }   
                  mid = (min+max)/2;
              }           
              return mid;
           } 

转载于:https://www.cnblogs.com/rqy0526/p/10954444.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462442.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于Android错误 View requires API level 14 (current...

2019独角兽企业重金招聘Python工程师标准>>> 问题描述&#xff1a;在界面配置文件main.xml中&#xff0c;可能用上某些控件&#xff08;例如GridLayout&#xff09;遇上下面所说的错误:View requires API level 14(current min is 8), 但将项目clear后&#xff0c;再…

socket-select函数

最近在用socket编程&#xff0c;用到select函数&#xff0c;于是上网查找资料&#xff0c;如下这篇是讲的比较详细易懂的&#xff1a;Select在Socket编程中还是比较重要的&#xff0c;可是对于初学Socket的人来说都不太爱用Select写程序&#xff0c;他们只是习惯写诸如 connect…

javascript 基础 转

最近面试过一些人, 发现即使经验丰富的开发人员, 对于一些基础的理论和细节也常常会模糊. 写本文是因为就我自己而言第一次学习下面的内容时发现自己确实有所收获和感悟. 其实我们容易忽视的javascript的细节还有更多, 本文仅是冰山一角. 希望大家都能通过本文有所斩获.一. Jav…

从表到里学习JVM实现

在社会化分工、软件行业细分专业化的趋势下&#xff0c;会真的参与到底层系统实现的人肯定是越来越少&#xff08;比例上说&#xff09;。真的会参与到JVM实现的人肯定是少数。但如果您对JVM是如何实现的有兴趣、充满好奇&#xff0c;却苦于没有足够系统的知识去深入&#xff0…

2019春第二次课程设计实验报告

2019春第二次课程设计实验报告 一、实验项目名称 用数组实现反弹球消砖块 二、实验项目功能描述 利用键盘按键控制小球方向让小球碰到挡板后反弹上去消除砖块。 三、项目模块结构介绍 四、实现界面展示 五、代码托管链接 https://gitee.com/huangxuannn/events 六、实验总结 上…

[SharePoint 2010] Client Object Model 跨时区查询list item的方法

SharePoint将所有的Datetime类型的数据都以universal的形式(UTC)存储在数据库中&#xff0c;当要在页面上显示类似list item的"Created", "Modified"等时间日期信息时&#xff0c;将数据库中的UTC时间取出来&#xff0c;然后根据当前Site的Regional Settin…

Linux下静态库和动态库的编译连接

http://blog.sina.com.cn/s/blog_4090ba590100t3nu.html .a文件 gcc -c test.c ar rc libtest.a test.o ranlib libtest.a 静态库只要编译出.o文件然后用ar打入包中就可以 动态库或共享库不用libtool工具&#xff1a; gcc -fpic -o test.o -c test gcc -shared -o te…

修改终端服务端口的方法

修改终端服务端口的方法Windows 2000 下的修改办法   win2k的终端服务可以运行在两种方式下&#xff1a;远程管理或应用程序服务器模式。   远程管理模式&#xff1a;允许一定数量的管理员远程管理这个服务器&#xff0c;这个模式对服务器性能的影响程度最低。   应用程序…

PYTHON -c

命令行执行代码转载于:https://www.cnblogs.com/BlueFire-py/p/10957663.html

Linux显示中文乱码解决方法

http://sumit.blog.51cto.com/162317/206698经常使用linux终端&#xff0c;有人上传中文命名的文件显示出中文乱码&#xff0c;下面是解决方法。默认显示的字符编码# echo $LANGen_US.UTF-8修改i18n文件# vi /etc/sysconfig/i18nLANG"zh_CN.GB18030"LANGUAGE"zh…

多行字符串的表示方式

原文载于&#xff1a;http://robinwu.iteye.com/blog/145514 其中最重要的、忽略一切转义字符、多行大包围、相当于的多行版本 1 str <<EOF 2 This isnt a tab: \t 3 and this isnt a newline: \n 4 EOF 5 6 puts str 转载于:https://www.cnblogs.com/kloboh…

nodejs+redis

为什么80%的码农都做不了架构师&#xff1f;>>> redis可以用来管理session http://www.csser.com/board/4f77e6f996ca600f78000936 然后使用的时候redis-server这个服务进程得开着&#xff0c;不然会悲剧的 转载于:https://my.oschina.net/kiloct/blog/137629

Caused by: java.lang.ClassNotFoundException: Cannot find class: User

源代码: <select id"selectAll" resultType"User">select user_id uid,user_name username,user_password password,user_gender gender, user_birthday birthday, user_status status from users</select> 正确代码: <select id"s…

标准C语言库 Glibc 2.15

http://www.oschina.net/p/glibc Glibc 是提供系统调用和基本函数的 C 库&#xff0c;比如open, malloc, printf等等。所有动态连接的程序都要用到它。 Glibc最新更新资讯&#xff0c;共2条 (投递新闻) 1个月前GNU libc 2.15 (Glibc) 发布 2评/952阅 7个月前GLib 2.30.0 发布&…

FxCAD 实验三 实现对象的【属性】事件

接着实验三&#xff0c;本次实验&#xff0c;实现鼠标右键点击【图形对象时】可以弹出一个【WinForm】属性界面 添加一个WindowsForm 界面&#xff0c;如图。类名字&#xff1a;FormBox 回到FxBox类文件 覆盖 SelectEvent 方法&#xff0c;添加上面的代码 运行程序&#xff0c;…

SQL Server文本和图像函数

文本和图像函数 1、查找特定字符串PATINDEX 语法与字符串的patindex一样。 2、获取文本指针TEXTPTR SQLServer在存储文本类型(ntext、text)和图像数据类型(image)时&#xff0c;默认情况是与常见的基本数据类型(如char、int等)这样的数据时单独存储的&#xff0c;也就是说&…

图像的灰度处理

图像的灰度处理的三种方法&#xff1a; 1.imread的方法将像素值修改为0 2.调用一个RGB转灰度的方法实现灰度转化&#xff08;cv2.COLOR_BGR2GRAY&#xff09; 3.R G B 的均值取灰度值来灰度转化&#xff08;原理&#xff09; 处理结果 如下: 转载于:https://www.cnblogs.com/Ja…

在Linux终端下调用可执行文件时总要加上符号./的原因

原网址 : http://blog.csdn.net/snakebite1985/article/details/1638453 刚接触Shell时总感到很奇怪&#xff1a;如果当前的Shell工作目录为/home/Victor/&#xff0c;且此目录下有一个叫做myproc的可执行文件&#xff0c;那么简单的在命令行中输入myproc并回车并不能调用这个…

面向对象基础-委托与事件

首先举一个实例&#xff1a;创建一个控制台程序&#xff0c;需求是&#xff1a;有一只猫Tom&#xff0c;有两只老鼠Jerry和Jack&#xff0c;Tom只叫一声“喵&#xff0c;我是Tom”&#xff0c;两只老鼠就说“老猫来了&#xff0c;快跑”&#xff0c;我们来分析一下&#xff1a;…

SQL Server数学函数

数学函数 1、计算绝对值ABS ABS函数对一个数值表达式结果计算绝对值(bit数据类型除外)&#xff0c;返回整数。 语法结构&#xff1a; ABS(数值表达式) 返回值&#xff1a;与数值表达式类型一致的数据 示例&#xff1a; SELECT ABS(-1) --输出 1 2、获取大于等于最小整数值Ce…