数组的几种排序算法的实现(1)

数据结构中的排序算法,各有用处,比如:
1,直接插入排序,在序列基本有序的情况下,移动的次数比较少,但是比较次数是一样的
复杂度O(n*n);
2,冒泡排序,这个不用说了吧,刚学C的人都懂了
3,希尔排序,只要是找出较好的增量,将数据排列成基本有序时,最后一次来一次直接插入排序,是对直接插入排序的改进.复杂度为O(n(3/2));
4,快速排序,算是所有排序中复杂度一般情况下比较好的算法,它设了一个枢轴,将它分为两部分,左边比它小,右边的比它大,复杂度为O(nlog n);
5,选择排序,和冒泡差不多的复杂度,
6,归并排序,这是一种稳定的排序方法,将数据分为各个有序的部分,再组合为一个整体,只要用递归的方法.
7,还有基数排序,树形排序,堆排序,等等,这里不多说了,你多多学习多多消化吧,慢慢学吧,多看看课本的算法,自己实现一次,学完了你的编程能力就能很好的提高了.

解释:时间复杂度

举个简单的例子,要从0加到n,我们会这么写:
int sum = 0;
for(int i = 0; i<=n; ++i)
{
   sum += i;
}
一共算了n次加法,那么就说这个时间复杂度是O(n)。当然O(n)的精确的概念是,是n的最高次方,比如,某个计算共计算了3n + 2次,那么这个时间复杂度也是O(n),因为3n + 2中的最高次方是n。

如果代码这么写:
int sum = 0;
for(int i = 0; i<=n; ++i)
{
   for(int j = 0; j <=n; ++j)
   {
      sum += (i + j);
   }
}

很显然一共算了n^2次加法,那么就说这个时间复杂度是O(n^2),和上面类似,如果某个算法计算了3*n^2 + n + 1次,其时间复杂度仍然是O(n^2),因为3*n^2 + n + 1中最高的次方是n^2

所谓O(1)就是计算的次数是个常量,我们还以上面从0加到n的例子来说,如果我们用等差数列的公式,那么,代码可以这么写:
int sum = n * (n + 1) / 2
不管n有多大(当然不能溢出了),通过上面的公式只需计算一次,也就说计算的次数是不变的,这种情况的时间复杂度就可以说成O(1)。 再比如如果某个计算,不管其他条件怎么变化,均只需计算5次即可得出结果,那么这种情况的时间复杂度,也是O(1)。

 

数组的排序方法有很多,效率也各不相同,下面简单介绍一下几种常见的排序算法。

      1.选择排序法:将要排序的数组分成两部分,一部分是从大到小已经排好序的,一部分是无序的,从无序的部分取出最小的放到已经排序的最后面。实现如下:

[java] view plaincopy
  1. public int[] choiceSort(int[] arr){  
  2.         for(int i = 0;i < arr.length;i++){  
  3.             int m = i;  
  4.             for(int j = i + 1;j < arr.length;j++){  
  5.                 //如果第j个元素比第m个元素小,将j赋值给m  
  6.                 if(arr[j] < arr[m]){  
  7.                     m = j;  
  8.                 }  
  9.             }  
  10.             //交换m和i两个元素的位置  
  11.             if(i != m){  
  12.                 int t = arr[i];  
  13.                 arr[i] = arr[m];  
  14.                 arr[m] = t;  
  15.             }  
  16.         }  
  17.         return arr;  
  18.     }  

       2.冒泡排序法:冒泡排序的思路就不用介绍了。上实现:

 

 

[java] view plaincopy
  1. public int[] bubbleSort(int[] arr){  
  2.         for(int i = 0;i < arr.length;i++){  
  3.             //比较两个相邻的元素  
  4.             for(int j = 0;j < arr.length-i-1;j++){  
  5.                 if(arr[j] > arr[j+1]){  
  6.                     int t = arr[j];  
  7.                     arr[j] = arr[j+1];  
  8.                     arr[j+1] = t;  
  9.                 }  
  10.             }  
  11.         }  
  12.         return arr;  
  13.     }  

      3.插入排序法:将要排序的数组分成两部分,每次从后面的部分取出索引最小的元素插入到前一部分的适当位置。基本实现如下:

[java] view plaincopy
  1. public int[] insertSort(int[] arr){  
  2.         for(int i = 1;i < arr.length;i++){  
  3.             int temp = arr[i];  
  4.             int j = i - 1;  
  5.             while(temp < arr[j]){  
  6.                 arr[j+1] = arr[j];  
  7.                 j--;  
  8.                 if(j == -1){  
  9.                     break;  
  10.                 }  
  11.             }  
  12.             arr[j+1] = temp;  
  13.         }  
  14.         return arr;  
  15.     }  

      4.快速排序法:快速排序法号称是目前最优秀的算法之一,实现思路是,将一个数组的排序问题看成是两个小数组的排序问题,而每个小的数组又可以继续看成更小的两个数组,一直递归下去,直到数组长度大小最大为2。实现如下:

[java] view plaincopy
  1. public int[] fastSort(int[] arr,int left,int right){  
  2.         if(left < right){  
  3.             int s = arr[left];  
  4.             int i = left;  
  5.             int j = right + 1;  
  6.             while(true){  
  7.                 //向右找大于s的元素的索引  
  8.                 while(i+1 < arr.length && arr[++i] < s);  
  9.                 //向左找小于s的元素的索引  
  10.                 while(j-1 > -1 && arr[--j] > s);  
  11.                 //如果i >= j 推出循环  
  12.                 if(i >= j){  
  13.                     break;  
  14.                 }else{  
  15.                     //教化i和j位置的元素  
  16.                     int t = arr[i];  
  17.                     arr[i] = arr[j];  
  18.                     arr[j] = t;  
  19.                 }  
  20.             }  
  21.             arr[left] = arr[j];  
  22.             arr[j] = s;  
  23.             //对左面进行递归  
  24.             fastSort(arr,left,j-1);  
  25.             //对右面进行递归  
  26.             fastSort(arr,j+1,right);  
  27.         }  
  28.         return arr;  
  29.     }  

转载于:https://www.cnblogs.com/guanshan/p/guan028.html

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

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

相关文章

才貌双全,既是学霸,又是运动达人,这个博士小姐姐太飒了

全世界只有3.14 % 的人关注了爆炸吧知识本文来源&#xff1a;募格学术唐文静&#xff0c;天津大学化工学院 2017级博士生&#xff0c;中共党员&#xff0c;天津大学长跑队队员。自博士入学之至今&#xff0c;以一作发表高水平学术论文2篇&#xff1a;Advanced Energy Materials…

TFS 2012研发管理能力(9)

转载于:https://blog.51cto.com/8382359/1342246

MAUI安卓子系统调试方法(附安装教程)

介绍本文主要介绍Windows 11操作系统下, 如何安装安卓子系统并且使用Visual Studio 2022 调试MAUI项目, 主要通过adb的方式与连接至安卓子系统。说明:1.关于如何使用Visual Studio 2019/2022 启用adb调试Xamarin安卓项目, 查看往期: https://www.cnblogs.com/zh7791/p/13863677…

Android之事件处理全面剖析

转载&#xff1a;http://blog.csdn.net/jxxfzgy/article/details/43926987 Android 事件处理机制说难也不难&#xff0c;说简单也不简单&#xff0c;为什么这么说呢&#xff1f;因为我相信大部分有了一定 Android 基础的同学&#xff0c;想要分析 Android 事件处理机制&#xf…

seata xid是什么_使用Seata彻底解决Spring Cloud中的分布式事务问题!

Seata是Alibaba开源的一款分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务&#xff0c;本文将通过一个简单的下单业务场景来对其用法进行详细介绍。什么是分布式事务问题&#xff1f;单体应用单体应用中&#xff0c;一个业务操作需要调用三个模块完…

基于netty的企业即时通讯系统的设计与实-离线消息处理

2019独角兽企业重金招聘Python工程师标准>>> 原文地址&#xff1a;http://www.cookqq.com/blog/8a10a5f35382ba2e0153c7a1125c20e7 客户端与服务器保持长连接&#xff0c;服务器可以很轻松的向客户端推送消息。由于网络不稳定、程序不可能24小时都被程序运行&…

object-c 入门基础篇

一、Objective-C与C的渊源 Objective-C诞生于 20 世纪 80 年代&#xff0c;由Brad Cox 发明&#xff0c;意在将流行的、可移植的 C 语言与优雅的 Smalltalk 语言结合在一起。Objective-C 是 C 语言的一个扩展集&#xff0c;它以 C 语言为基础,在语言中添加了一些微妙但意…

GeneralUpdate实现应用程序更新

微软中国MSDN 点击上方蓝字关注我们大家好&#xff0c;我是本期的实验室研究员——朱震。今天我将通过实验和完整的操作过程&#xff0c;向大家介绍如何基于开源项目GeneralUpdate打造一个能自动升级的客户端应用。接下来就让我们一起到实验室中一探究竟吧&#xff01;微软MVP…

看完数学概念背后的故事,让孩子的数学兴趣激增1000倍!

▲ 点击查看英国著名科学家霍金在撰写《时间简史》的时候&#xff0c;出版商郑重其事地建议道&#xff1a;“你的书里多一条数学公式&#xff0c;就会失去一部分读者。”可见对数理化的害怕&#xff0c;也没有国界&#xff0c;大家都一样。看着满满都是概念和数字的课本&#x…

栈和队列之生成窗口最大值数组

package com.chenyu.zuo.stackAndQueue;import java.util.LinkedList;/*** 题目:有一个整形数组,arr和一个大小为w的窗口从数组的最左边滑到最右边,窗口每次向右滑动一个位置。* 例如数组[4,3,5,4,3,3,6,7],窗口的大小为3时;* [4 3 5] 4 3 3 6 7 窗口中最大值为5* 4[ 3…

主存和cache每一块相等_笔记:cpu中的cache(一)

前言&#xff1a;绝大部分内容来源于北京大学的慕课《计算机组成原理》&#xff0c;地址&#xff1a;https://www.coursera.org/learn/jisuanji-zucheng存储体系&#xff08;《深入理解计算机系统》&#xff09;cache是为了解决cpu和内存速度不对等的问题。一&#xff0c;cache…

MATLAB中求矩阵非零元的坐标

MATLAB中求矩阵非零元的坐标&#xff1a; 方法1&#xff1a; indexfind(a); [i,j]ind2sub(size(a),index); disp([i,j])方法2&#xff1a; [i,j]find(a>0|a<0) %列出所有非零元的坐标 [i,j]find(ak) %找出等于k值的矩阵元素的坐标所用函数简介&#xff1a; IND2SUB Mult…

设计模式学习笔记(十七)——Command命令模式

设计模式学习笔记&#xff08;十七&#xff09;——Command命令模式 Command命令模式介绍&#xff1a; Command命令模式是一种对象行为型模式&#xff0c;它主要解决的问题是&#xff1a;在软件构建过程中&#xff0c;“行为请求者”与“行为实现者”通常呈现一种“紧耦合”的问…

MAUI中Maui.Graphics.Controls绘制控件

简介Microsoft.Maui.Graphics是一个完全采用C#的iOS&#xff0c;Android&#xff0c;Windows&#xff0c;macOS&#xff0c;Tizen和Linux的跨平台图形库。对于MAUI项目当中绘制的方案是使用不同平台的控件来而非自绘。当然MAUI当中也使用了Microsoft.Maui.Graphics,MAUI Previe…

BGP聚合as-set advertise-map

advertise-map xxx 用来挂汇总路由的&#xff0c;当route-map xxx 中的路由存在时&#xff0c;才会出现汇总路由。否则没有汇总路由只继承advertise-map xxx 中路由的属性当汇总路由携带了多个明细属性&#xff0c;可用advertise-map xxx 来移除某个明细路由的路由属性实验拓扑…

Android之如何解决popupWindow(pw.setFocusable(true))按返回键和menu键退出

先爆照: 问题: 使用过popupWindow的时候,我们为了让其它地方不可点击,我们一般会pw.setFocusable(true),但是当我们这样设置之后,问题出现了,按返回键或者menu菜单键没有反应,这是原因呢? PopupWindow 跟我们的 Activity 不一样,因为我们在构造 PW 的时候往往不是继…

上班骚扰男同事被抓到......

1 不同年代的辞职理由&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 月壤不能种菜太让人失望了▼3 原来&#xff0c;我也努力过▼4 忘了上班还有监控&#xff08;作者来源最右&#xff0c;ID&#xff1a;8943090 &#xff09;▼5 这是台风被黑的最惨的一次&…

mysql8 修改权限_MySQL8修改重置root密码,远程连接权限设置

MySQL8 修改重置root密码这里要单独强调是MySQL8&#xff0c;因为在MySQL 8.04前&#xff0c;执行&#xff1a;SET PASSWORDPASSWORD([新密码]);可行&#xff0c;但是MySQL8.0.4开始&#xff0c;这样默认是不行的。因为之前&#xff0c;MySQL的密码认证插件是“mysql_native_pa…

.NET 6新特性试用 | DateOnly和TimeOnly类型

前言在.NET 6之前&#xff0c;没有方法来直接表示没有时间的日期&#xff08;比如生日&#xff09;或者没有日期的一天中的时间&#xff08;比如闹钟&#xff09;。虽然我们可以使用DateTime类和TimeSpan类来代替&#xff0c;但是实际使用中会存在一些问题&#xff1a;var date…

用wordpress制作网站的总结

在没有自己的网站的时候很像拥有一个属于自己的网站&#xff0c;可以说是自己的一个愿望吧。但是当我真正的运行起来了之后觉得没有多么的兴奋&#xff0c;自己也折腾了几天wordpress,从买域名空间&#xff0c;到安装WP&#xff0c;遇到了一些问题&#xff0c;自己到处搜索答案…