各种排序算法思想复杂度及其java程序实现
一、冒泡排序(BubbleSort)
1. 基本思想:
设排序表长为n,从后向前或者从前向后两两比较相邻元素的值,如果两者的相对次序不对(A[i-1] > A[i]),则交换它们,
其结果是将最小的元素交换到待排序序列的第一个位置,我们称它为一趟冒泡。下一趟冒泡时,前一趟确定的最小元素
不再参与比较,待排序序列减少一个元素,每趟冒泡的结果把序列中最小的元素放到了序列的”最前面”。
2.算法实现
package 冒泡排序;
/**
* 相邻数据两两比较,大的排上面,小的排下面 第一次可排出最小的值
* 第二次排出第二小的值
* 第三次排出第三小的值
* 以此类推排出顺序
*
* 最优时间复杂度:O(n) (表示遍历一次发现没有任何可以交换的元素,排序结束。)
最坏时间复杂度:O(n2)
稳定性:稳定
* @author Administrator
*
*/
public class BubbleSort {
//初级版(从左往右比较)
/**
* 第0次排序==0546897231
第1次排序==0156897432
第2次排序==0126897543
第3次排序==0123897654
第4次排序==0123498765
第5次排序==0123459876
第6次排序==0123456987
第7次排序==0123456798
第8次排序==0123456789
第9次排序==0123456789
最终排序==0123456789
* 最优时间复杂度:O(n) (表示遍历一次发现没有任何可以交换的元素,排序结束。)
最坏时间复杂度:O(n2)
稳定性:稳定
*/
public static void sort1(int[] num){
int i,j,temp;
for(i=0;i<num.length;i++){
//第一次i=0,排出最小的值0
//第二次i=1,排出第二小的值1
for(j=i+1;j<num.length;j++){
if (num[i]>num[j]) {
temp=num[i];
num[i]=num[j];
num[j]=temp;
}
}
}
}
//中级版(从右往左比较)
public static void sort2(int[] num){
int i,j,temp;
for(i=0;i<num.length;i++){ for(j=num.length-1;j>i;j--){
if (num[j-1]>num[j]) {
temp=num[j-1];
num[j-1]=num[j];
num[j]=temp;
}
}
String str="";
for (int k : num) {
str+=k;
}
System.out.println("第"+i+"次排序=="+str);
}
String str2="";
for (int k : num) {
str2+=k;
}
System.out.println("最终排序=="+str2); }
//终极版
public static void sort3(int[] num){
int i,j,temp;
boolean flag=true;
for(i=0;i<num.length&&flag;i++){
flag=false;
for(j=num.length-1;j>i;j--){
//从右往左两两相比较,大于说明可以交换数值,小于使用flag=false直接跳过
if (num[j-1]>num[j]) {
temp=num[j-1];
num[j-1]=num[j];
num[j]=temp;
flag=true;
}
}
}
} public static void main(String args[]){
int[] num={5,2,4,6,8,9,7,1,3,0};
// sort1(num);
// sort2(num);
sort3(num);
} }
二、选择排序
1. 基本思想:
从未排好的部分的第一个作为最小(最大)的,然后依次和剩余的比较,如果有更小(更大)的,记下下标,
以此作为新的最小(最大)值,继续比较,一趟结束后,可以得到最小值。
例如:初始序列:{49 27 65 97 76 12 38}
第1趟:12与49交换:12{27 65 97 76 49 38}(选择第一个数与后面剩下的数两两比较,交互位置,排出第一个最小值)
第2趟:27不动 :12 27{65 97 76 49 38}(第一个数已经排好,选择第二个数与后面剩下的数两两比较,交互位置,排出第二个最小值)
第3趟:65与38交换:12 27 38{97 76 49 65}(第二个数已经排好,选择第三个数与后面剩下的数两两比较,交互位置,排出第三个最小值)
第4趟:97与49交换:12 27 38 49{76 97 65}以此类推
第5趟:76与65交换:12 27 38 49 65{97 76}
第6趟:97与76交换:12 27 38 49 65 76 97 完成
2. 算法实现:
package 简单选择排序;
/**
* 选择一个min做基准和其他的数据相互比较,如果比较的数大则把当前的数的赋值给min
* 以此类推
* @author Administrator
*
*/
public class SelectSort {
//简单选择排序,选择一个min做基准和其他的数据相互比较
/**
* 最优时间复杂度:O(n2)
最坏时间复杂度:O(n2)
稳定性:不稳定(考虑升序每次选择最大的情况)
* @param num
*/
public static void sort(int[] num){
int i,j,min,temp;
for(i=0;i<num.length;i++){
min=i;//将当前下标定义为最小值下标
for(j=i+1;j<num.length;j++){
if (num[min]>num[j]) {
min=j;//如果有小于当前最小值的关键字,将此关键字的下标赋值给min
}
}
if (i!=min) {//若min不等于i,说明min发生改变,即上面相互比较的为true,即有最小值,交换
temp=num[i];
num[i]=num[min];
num[min]=temp;
}
String str="";
for (int k : num) {
str+=k;
}
System.out.println("第"+i+"次排序=="+str);
}
String str2="";
for (int k : num) {
str2+=k;
}
System.out.println("最终排序=="+str2); } public static void main(String args[]){
int[] num={5,2,4,6,8,9,7,1,3,0};
sort(num); }
}
三、插入排序(Insertion Sort)
1. 基本思想:
有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,
这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,
从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。
每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当位置,使数列依然有序;直到待排序数据元素全部插入完为止。
【示例】:
[初始关键字] [49] 38 65 97 76 13 27 49(选择49)
J=2(38) [38 49] 65 97 76 13 27 49(选择38插入到49前面)
J=3(65) [38 49 65] 97 76 13 27 49(选择65插入到49前面)
J=4(97) [38 49 65 97] 76 13 27 49(选择97插入到65前面)
J=5(76) [38 49 65 76 97] 13 27 49(以此类推)
J=6(13) [13 38 49 65 76 97] 27 49
J=7(27) [13 27 38 49 65 76 97] 49
J=8(49) [13 27 38 49 49 65 76 97]
2. 算法实现:
package 直接插入排序; public class InsertSort {
/**
* 插入排序
*
* @paramarr
* @return
*/
public static void insert(int[] num)
{
for(int i=1;i<num.length;i++) //n-1此扫描,依次向前插入n-1个元素
{
int temp=num[i]; //每趟将num[i]插入到前面的排序子序列中
int j;
for(j=i-1;j>=0&&temp<num[j];j--)
{
num[j+1]=num[j]; //将前面较大的元素向后移动
}
num[j+1]=temp; //temp值到达插入位置
String str="";
for (int k : num) {
str+=k;
}
System.out.println("第"+i+"次排序=="+str);
}
String str2="";
for (int k : num) {
str2+=k;
}
System.out.println("最终排序=="+str2);
} public static void main(String[] args) {
// TODO 自动生成的方法存根
int[] num = { 5, 2, 4, 6, 8, 9, 7, 1, 3, 0 };
insert(num);
}
}
各种排序算法思想复杂度及其java程序实现的更多相关文章
- 十大经典排序算法详细总结(含JAVA代码实现)
原文出处:http://www.cnblogs.com/guoyaohua/p/8600214.html 0.排序算法说明 0.1 排序的定义 对一序列对象根据某个关键字进行排序. 0.2 术语说明 ...
- JAVA十大经典排序算法最强总结(含JAVA代码实现)
0.排序算法说明 0.1 排序的定义 对一序列对象根据某个关键字进行排序. 0.2 术语说明 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面: 不稳定:如果a原本在b的前面,而a=b,排 ...
- C++:主要几种排序算法及其复杂度
常见排序算法稳定性和复杂度分析快速简记以及转载 分类: 算法 2012-02-07 22:18 399人阅读 评论(1) 收藏 举报 算法mergeshell http://blogold.chin ...
- 排序算法入门之快速排序(java实现)
快速排序也是一种分治的排序算法.快速排序和归并排序是互补的:归并排序将数组分成两个子数组分别排序,并将有序的子数组归并以将整个数组排序,会需要一个额外的数组:而快速排序的排序方式是当两个子数组都有序时 ...
- 排序算法入门之堆排序(Java实现)
堆排序 在学习了二叉堆(优先队列)以后,我们来看看堆排序.堆排序总的运行时间为O(NlonN). 堆的概念 堆是以数组作为存储结构. 可以看出,它们满足以下规律: 设当前元素在数组中以R[i]表示,那 ...
- 排序算法之直接插入排序(java实现)
package com.javaTest300; import java.util.Arrays; public class Test041 { public static void main(Str ...
- 排序算法入门之归并排序(java实现)
归并排序是采用分治法的典型应用. 参考<数据结构与算法分析-Java语言描述> 归并排序其实要做两件事: (1)"分解"--将序列每次折半划分. (2)"合并 ...
- 排序算法入门之插入排序(java实现)
插入排序思想:相当于插入元素,对于第i个元素,i之前的元素已经是有序的了,这时候将第i个元素依次与前面元素比较,插入合适的位置.
- 算法Sedgewick第四版-第1章基础-2.1Elementary Sortss-008排序算法的复杂度(比较次数的上下限)
一. 1. 2.
随机推荐
- hello gradle
首先下载和安装gradle可以参考官网下载地址,建议下载带有源码和文档的,以便后期查阅. 下载完以后打开终端输入gradle -v有如下信息输出,表示安装成功: bogon:gradle scott$ ...
- 您好,python的请求es的http库是urllib3, 一个请求到贵司的es节点,想了解下,中间有哪些网关啊?冒昧推测,贵司的部分公共网关与python-urllib3的对接存在异常?
您好,python的请求es的http库是urllib3, 一个请求到贵司的es节点,想了解下,中间有哪些网关啊?冒昧推测,贵司的部分公共网关与python-urllib3的对接存在异常? 负载均衡( ...
- SQL Server批量数据导出导入BCP&Bulk使用
数据导出导入,首先考虑使用什么技术实现导出与导入利用BCP结合Bulk技术实现数据的导出与导入 1.bcp数据导出(这里是命令行方式),导出的数据需是格式化的,有两种方式可选 a.对传输的数据格式要求 ...
- python + unittest 做单元测试之学习笔记
单元测试在保证开发效率.可维护性和软件质量等方面有很重要的地位,所谓的单元测试,就是对一个类,一个模块或者一个函数进行正确性检测的一种测试方式. 这里主要是就应用 python + unitest 做 ...
- cocos-lua基础学习(八)Layer类学习笔记
创建 local layer = cc.Layer:create() local layer1 = cc.LayerColor:create(cc.c4b(192, 0, 0, 255), s.wid ...
- node核心:异步流程控制
Node.js的异步是整个学习Node.js过程中重中之重. 1)异步流程控制学习重点 2)Api写法:Error-first Callback 和 EventEmitter 3)中流砥柱:Promi ...
- vs2010中如何编写C语言程序
File->New->Project 在打开的New Project对话框中最左侧一栏中选择Visual C++下面的CLR,之后在其右侧的区域中选择CLR Empty Applicati ...
- Good Bye 2018 Solution
A. New Year and the Christmas Ornament 签到. #include <bits/stdc++.h> using namespace std; int a ...
- hdu 5140 主席树
这题说的是每个员工有工资 水平 在公司待的年限这几个属性,有大量的查询 查的是在一定的水平和工作年限的工人总工资是多少 这个思路是比较简单的我们按照他们的水平排序,排完后,使用主席树不断地往里面插,然 ...
- centos设置代理上网
centos设置代理上网 假设我们要设置代理为 IP:PORT 1.网页上网 网页上网设置代理很简单,在firefox浏览器下 Edit-->>Preferences-->> ...