java数据结构和算法
一 .冒泡算法
1.核心思想
比较两个元素,如果前一个比后一个大则进行交换,经过对每个元素的比较,最后将最大的元素设置成最后一个元素,重复该操作,最后形成一个从小到大的排序。
2.原理理解
例如:
有数组里面有4个数,则冒 3轮就可以实现排序。
第一轮 数据比较 3次
第二轮 数据比较 2次
第三轮 数据比较 1次3.代码实现
public class BubblingTest {
private int index = 0;
private long[] arr = null;
public BubblingTest(){
if(arr==null){
arr = new long[50];
}
}
public void insert(int value){
arr[index] = value;
index++;
}
public void display(){
for(int i=0;i<index;i++){
System.out.print(arr[i]+",");
}
System.out.println(arr.toString());
}
public void bubblingSort(){
long temp = 0L;
for(int i=0;i<index-1;i++){ // 轮数
for(int j=0;j<index-i-1;j++){ //比较次数
if(arr[j]>arr[j+1]){
temp = arr[j];
arr[j]=arr[j+1];
arr[j+1] = temp;
}
}
}
}
public static void main(String[] args) {
BubblingTest test = new BubblingTest();
test.insert(10);
test.insert(12);
test.insert(1);
test.insert(20);
test.bubblingSort();
test.display();
}
}二.选择排序算法
1.核心思想
扫描所有的元素,得到最小的元素,并将最小的元素与左边第一个元素进行交换,再次扫描出第一位置的所有元素,得到最小的元素,与左边第二个元素进行交换,一次类推。
2.原理理解
例如:
有数组里面有4个数,则选择 3轮就可以实现排序。
轮数 首位数下标 比较数首位下标 数据总数
第一轮 0 1 4
第二轮 1 2 3
第三轮 2 3 23.代码实现
public class SelectTest {
private long[] arr = null;
private int index = 0;
public SelectTest(){
if(arr == null){
arr = new long[20];
}
}
public void insert(int value){
arr[index] = value;
index++;
}
public void display(){
for(int i=0;i<index;i++){
System.out.print(arr[i]+" ");
}
System.out.println();
}
public void selectSort(){
for(int i=0;i<index-1;i++){//选择几轮
int k = i;//记录下标
for(int j=i+1;j<index;j++){ // 选最小的记录
if(arr[k]>arr[j]){
k = j;//记下目前找到的最小值所在的位置
}
}
//在内层循环结束,也就是找到本轮循环的最小的数以后,再进行交换
if(k!=i){ //交换a[i]和a[k]
long temp = arr[i];
arr[i] = arr[k];
arr[k] = temp;
}
}
}
public static void main(String[] args) {
SelectTest test = new SelectTest();
test.insert(12);
test.insert(2);
test.insert(32);
test.insert(17);
test.insert(52);
test.display();
test.selectSort();
test.display();
}
}三.插入排序算法
1.核心思想
抽出一个元素,在其前面的元素中找到合适的位置进行插入。
2.原理理解
例如:
有数组里面有4个数,则插入 3轮就可以实现排序。
轮数 选择数下标 待比较首位数下标 待比较数据总数
第一轮 1 0 1
第二轮 2 1 2
第三轮 3 2 33.代码实现
public class InsertTest {
private static long[] arr = null;
private int index;
public void insert(int value){
arr[index] = value;
index++;
}
public void display(){
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
System.out.println();
}
public void insertSort(){
for(int i=1;i<arr.length;i++){ //插入几轮
long temp = arr[i];
for(int j=i-1;j>=0 ;j--){//待比较数据个数,和首位数据下标
if(arr[j]>temp){
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
}
public static void main(String[] args) {
arr = new long[4]; //4位数比较
InsertTest test = new InsertTest();
test.insert(10);
test.insert(12);
test.insert(1);
test.insert(20);
test.display();
test.insertSort();
test.display();
}
}四.对象排序算法
1.新建一个对象类
public class Student {
private String name;
private String sex;
private int age;
private String stuNumber;
public Student(String name, String sex, int age, String stuNumber) {
super();
this.name = name;
this.sex = sex;
this.age = age;
this.stuNumber = stuNumber;
}
public String getStuNumber() {
return stuNumber;
}
public void setStuNumber(String stuNumber) {
this.stuNumber = stuNumber;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "ObjectTest [name=" + name + ", sex=" + sex + ", age=" + age + ", stuNumber=" + stuNumber + "]";
}
}2.添加比较方法
public class StudentSort {
private Student[] students = null;
private int index;
public StudentSort(int value){
students = new Student[value];
}
public void insert(Student stu){
students[index] = stu;
index++;
}
public void display(){
for(int i=0;i<index;i++){
System.out.println(students[i].toString());
}
}
/**
* name冒泡排序
*/
public void bubblingSortByName(){
for(int i=0;i<students.length-1;i++){
Student stemp = null;
for(int j=0;j<students.length-1-i;j++){
if(students[j].getName().compareTo(students[j+1].getName())>0){
stemp = students[j];
students[j] = students[j+1];
students[j+1] = stemp;
}
}
}
}
/**
* name插入排序
*/
public void insertSortByName(){
for(int i=1;i<students.length;i++){
Student insertTemp = students[i];
for(int j=i-1;j>=0;j--){
if(students[j].getName().compareTo(insertTemp.getName())>0){
students[j+1]=students[j];
students[j] = insertTemp;
}
}
}
}
/**
* name 选择排序
*/
public void selectSortByName(){
for(int i=0;i<students.length-1;i++){
int tempIndex = i;
for(int j=i;j<students.length-1;j++){
if(students[j].getName().compareTo(students[j+1].getName())>0){
tempIndex = j+1;
}
}
if(tempIndex!=i){
Student min = students[tempIndex];
students[tempIndex] = students[i];
students[i] = min;
}
}
}
}3.测试比较方法
public class ObjectTest {
public static void main(String[] args) {
Student stu = new Student("zhansan", "man", 12, "122201");
Student stu1 = new Student("lisi", "man", 14, "122203");
Student stu2 = new Student("wangwu", "woman", 18, "122205");
Student stu3 = new Student("zhaoliu", "woman", 13, "122202");
StudentSort sort = new StudentSort(4);
sort.insert(stu);
sort.insert(stu1);
sort.insert(stu2);
sort.insert(stu3);
sort.display();
// sort.bubblingSortByName();
// sort.insertSortByName();
sort.selectSortByName();
System.out.println("排序后");
sort.display();
}
}五.栈
1.核心思想
栈只允许访问一个数据项,也就是最后插入的数据项。只有移除了这个数据项,才能访问倒数第二个插入的数据项。
2.原理理解
栈里面的数据可以看成是一个数组,栈里能存元素的最大个数用maxSize表示,栈顶位置用top表示。
3.代码实现
public class MyStack {
private int maxSize;
private long[] arr;
private int top;
public MyStack(int value){
maxSize = value;
arr = new long[maxSize];
top = -1;
}
//压入数据
public void push(long value){
top++;
arr[top] = value;
}
//弹出数据
public long pop(){
return arr[top--];
}
//访问栈顶数据
public long peek(){
return arr[top];
}
//栈是否为空
public boolean isEmpty(){
return (top==-1);
}
//栈是否满了
public boolean isFull(){
return (top==maxSize-1);
}
}
public class StackTest {
public static void main(String[] args) {
MyStack stack = new MyStack(10);
stack.push(12);
stack.push(22);
stack.push(52);
stack.push(16);
stack.push(13);
while(!stack.isEmpty()){
System.out.println("栈顶数据"+stack.peek());
System.out.println(stack.pop());
}
}
}
文章标题:java数据结构和算法
发布时间:2020-01-15, 17:13:18
最后更新:2020-01-15, 17:13:19