直接插入排序
直接插入排序基本思想每一步将一个待排序的数据插入到前面已经排好序的有序序列中,直到插完所有元素为止。
从序列第一个元素开始,该元素可以认为已经被排序。
取出下一个元素,设为待插入元素,在已经排序的元素序列中从后向前扫描,如果该元素(已排序)大于待插入元素,将该元素移到下一位置。
重复步骤2,直到找到已排序的元素小于或者等于待排序元素的位置,插入元素。
重复2,3步骤,完成排序。
思路
代码实现1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253package com.nanzx.sort;import java.util.Arrays;public class InsertSort { public static void main(String[] args) { int[] arr = { 4, 6, 8, 5, 9}; insertSort(arr); } public sta ...
简单选择排序
简单选择排序基本思想在a[1]-a[n-1]中选择最小的元素和a[0]交换;在a[2]-a[n-1]中选择最小的元素和a[1]交换;……在a[i]-a[n-1]中选择最下的元素和a[i-1]交换;
思路
代码实现1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859package com.nanzx.sort;import java.util.Arrays;public class SelectSort { public static void main(String[] args) { int arr[] = { 101, 34, 119, 1 }; // 每i轮确定第i个元素为最小值 selectSort(arr); } public static void selectSort(int[] arr) { int minIndex = 0; ...
冒泡排序
冒泡排序(Bubble Sort)冒泡排序是一种交换排序。
基本思想两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。
思路
代码实现123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354package com.nanzx.sort;import java.util.Arrays;public class BubbleSort { public static void main(String[] args) { int arr[] = { 6, 3, 5, 7, 0 }; int temp; //临时变量,用于交换; // 第一趟排序,就是将第一大的数排在倒数第一位 for (int j = 0; j < arr.length - 1; j++) { if (arr[j] > arr[j + 1]) { temp = arr[j]; ...
排序算法及算法复杂度
排序算法排序的介绍排序也称排序算法(Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程。
排序的稳定性未排序前:
编号
姓名
总分
1
令狐冲
753
2
郭靖
573
3
杨过
682
4
张无忌
753
排序后:
编号
姓名
总分
1
令狐冲
753
4
张无忌
753
3
杨过
682
2
郭靖
573
如上所示,经过对总分的降序排序后,总分高的排在前列。
此时对于令狐冲和张无忌而言,未排序前是令狐冲在前,那么他们总分排序后,分数相等的令狐冲应该依然在前,这样才算是稳定的排序。如果他们二者颠倒了,则此排序是不稳定的了。
只要有一组关键字实例发生颠倒情况,就可认为此排序方法是不稳定的。排序算法是否稳定的,要通过分析后才能得出。
排序的分类内排序是在排序整个过程中,待排序的所有记录全部被放置在内存中。
外排序是由于排序的记录个数太多,不能同时放置在内存,整个排序过程需要在内外存之间多次交换数据才能进行。
算法的时间复杂度算法效率的度量方法事后统计方法:这种方法主要是通过设计好的测试程序和数据,利用计算 ...
递归
递归(Recursion)介绍 简单的说, 递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。
递归小案例打印问题:
123456public static void test(int n) { if (n > 2) { test(n - 1); } System.out.println("n=" + n);}
阶乘问题:
1234567public static int factorial(int n) { if (n == 1) { return 1; } else { return factorial(n - 1) * n; }}
递归应用场景
各种数学问题如: 8皇后问题 , 汉诺塔, 阶乘问题, 迷宫问题, 球和篮子的问题(google编程大赛)
各种算法中也会使用到递归,比如快排,归并排序,二分查找,分治算法等
将用栈解决的问题使用递归代码比较简洁
递归需要遵守 ...
栈实现综合计算器
栈的介绍
栈的英文为(stack)
栈是一个先入后出(FILO-First In Last Out)的有序列表。
栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。
根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除。
栈的插入操作(push),称压栈、入栈。类似子弹入弹夹。 栈的删除操作(pop),叫作出栈,也有的叫作弹栈。如同弹夹中的子弹出夹。
栈的顺序存储结构
栈的链式存储结构
栈的应用场景
子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出, 回到原来的程序中。
处理递归调用:和子程序的调用类似,只是除了储存下一个指令的地址外,也将参数、区域变量等数据存入堆栈中。
表达式的转换[中缀表达式转后缀表达式]与求值(实际解决)。
二叉树的遍历。
图形的深度优先(depth一first)搜索法。
用数组模拟栈12 ...
环形链表和约瑟夫问题
约瑟夫(Josephu)问题介绍约瑟夫问题(约瑟夫环、丢手绢问题)为:设编号为1,2,…n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。
方法用一个不带头结点的循环链表来处理Josephu问题:先构成一个有n个结点的单循环链表,然后由k结点起从1开始计数,计到m时,对应结点从链表中删除,然后再从被删除结点的下一个结点又从1开始计数,直到最后一个结点从链表中删除算法结束。
创建Boy(小孩)对象,每一个对象就是一个节点12345678910111213141516171819202122232425class Boy { private int no; private Boy next; public Boy(int no) { this.no = no; } public int getNo() { return no; } public voi ...
单向链表和双向链表
链表(Linked List)介绍链表是有序的列表,它在内存中存储如下:
链表是以节点的方式来存储,是链式存储
每个节点包含data域和指针域
如图:链表的各个节点不一定是连续存储
链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定
带头结点的单向链表示意图如下:
带头结点的双向链表示意图如下:
单向链表的应用实例使用带头结点的单向链表,实现水浒英雄排行榜对英雄人物的增删改查操作。
创建Hero对象,每一个对象就是一个节点1234567891011121314151617181920class HeroNode { // data域 public int no; public String name; public String nickname; // next域 public HeroNode next; public HeroNode(int no, String name, String nickname) { this.no = no; this.name = name; this.nickname = nick ...
顺序队列和循环队列的数组实现
队列介绍
1)队列是一个有序列表,可以用数组或是链表来实现。2)遵循先入先出的原则。即:先存入队列的数据,要先取出,后存入的要后取出。
顺序队列
顺序队一般会设置两个指针进行管理:front指针指向队列的第一个元素,rear指针指向最后一个元素的下一个位置,初始值都是0。
每次在队尾插入一个元素是,rear增1;每次在队头删除一个元素时,front增1。当front=rear时,队列中没有任何元素,称为空队列。
顺序队列中的溢出现象:
“下溢”现象:当队列为空时,做出队运算产生的溢出现象。“下溢”是正常现象,常用作程序控制转移的条件。
“真上溢”现象:当队列满时,做进队运算产生空间溢出的现象。“真上溢”是一种出错状态,应设法避免。
“假上溢”现象:由于入队和出队操作中,头尾指针只增加不减小,致使被删元素的空间永远无法重新利用。当队列中实际的元素个数远远小于向量空间的规模时,也可能由于尾指针已超越向量空间的上界而不能做入队操作。该现象称为”假上溢”现象。
顺序队列的缺陷:当rear增加到指向分配的连续空间之外时,队列无法再插入新元素,但这时往往还有大量可用空间未被占用 ...