1、冒泡排序
/**
冒泡排序算法
冒泡排序算法的运作如下:(从后往前)
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。
*/
import java.util.Scanner;
public class Test12{
public static void main(String[] args){
int[] nums = {34,4,56,56,90,65};//待排序的数列
//外循环控制轮数
for(int i=0;i<nums.length-1;i++){ //比较轮数等于数列的长度-1
for(int j=0;j<nums.length-1-i;j++){
if(nums[j]>nums[j+1]){
nums[j] = nums[j]+nums[j+1];
nums[j+1] = nums[j]-nums[j+1];
nums[j] = nums[j]-nums[j+1];
}
}
}
//输出结果
for(int n : nums){
System.out.println(n);
}
}
}
/*
34 4 56 17 90 65
4 34 17 56 65 90 //第一轮 5次
4 17 34 56 65 //第二轮 4次
4 17 34 56 //第三轮 3次
4 17 34 //第四轮 2次
4 17 //第五轮 1次
*/
2、选择排序
/**
选择排序算法
每一趟从待排序的数据元素中选出最小(或最大)的一个元素,
顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
选择排序是不稳定的排序方法。
*/
import java.util.Scanner;
public class Test13{
public static void main(String[] args){
int[] nums = {34,4,56,17,90,65};//待排序的数列
int minIndex = 0;//用于记录每次比较的最小值下标
//控制轮数
for(int i=0;i<nums.length-1;i++){
minIndex = i;//每轮假设一个最小值下标
for(int j=i+1;j<nums.length;j++){
if(nums[minIndex]>nums[j]){
minIndex = j;
}
}
//判断需要交换的数下标是否为自己
if(minIndex!=i){
nums[minIndex] = nums[minIndex]+nums[i];
nums[i] = nums[minIndex]-nums[i];
nums[minIndex] = nums[minIndex]-nums[i];
}
}
//输出结果:
for(int n: nums){
System.out.println(n);
}
}
}
/*
34 4 56 17 90 65
4 34 56 17 90 65 第一轮 5次
4 17 56 34 90 65 第二轮 4次
4 17 34 56 90 65 第三轮 3次
4 17 34 56 90 65 第四轮 2次
4 17 34 56 65 90 第五轮 1次
*/
3、插入排序
/**
直接插入排序算法
(从后向前找到合适位置后插入)
基本思想:每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的子序列的合适位置(从后向前找到
合适位置后),直到全部插入排序完为止。
*/
import java.util.Scanner;
public class Test14{
public static void main(String[] args){
int[] nums = {34,4,56,17,90,65};//待排序的数列
//控制比较的轮数:
for(int i=1;i<nums.length;i++){
int temp = nums[i]; //记录操作数
int j = 0;
for(j=i-1;j>=0;j--){
if(nums[j]>temp){
nums[j+1] = nums[j];
}else{
break;
}
}
if(nums[j+1]!=temp){
nums[j+1] = temp;
}
}
//输出结果:
for(int n : nums){
System.out.println(n);
}
}
}
/*
34 4 56 17 90 65
temp=4
第一轮:i=1,4要插到34前,就要把34往后挪,变为34,34,56,17,90,65
再从temp中拿到数:4,34,56,17,90,65
temp=56
第二轮:i=2,56>34,直接退出:4,34,56,17,90,65
temp=17
第三轮:i=3 4,34,56,56,90,65
4,34,34,56,90,65
4,17,34,56,90,65
temp=90
第四轮:i=4,90>57,直接退出
temp=65
第五轮:i=5 4,17,34,56,90,90
4,17,34,56,65,90
*/
4、二分查找
/**
二分法查找(折半查找):前提是在已经排好序的数组中,
通过将待查找的元素与中间索引值对应的元素进行比较,若大于中间索引值对应的元素,
去右半部分查找,否则,去左半部分查找。
依此类推。直到找到为止;找不到返回一个负数。
*/
import java.util.Scanner;
public class Test15{
public static void main(String[] args){
//必须保正数列是有序的
int[] num = {10,20,50,65,88,90};
int index = binarySearch(num,88);
System.out.println(index);
}
//二分查找算法
public static int binarySearch(int[] num,int key){
int start = 0;//开始下标
int end = num.length-1;//结束下标
while(start<=end){
int middle = (start+end)/2; //>>>1
if(num[middle]>key){
end = middle-1;
}else if(num[middle]<key){
start = middle+1;
}else{
return middle;
}
}
return -1;
}
}
5、归并排序
MergeSort(归并排序)算法Java实现 - 九天高远 - 博客园 (cnblogs.com)
算法主要思想
template<class T>
void merge( T r[],T r2[],int s,int mid,int t)
//s为第一个子表首元素的下标,mid为第一个子表末元素的下标
//t为第二个子表末元素的下标
{ int i,j,k;
i=s;j=mid+1;k=s; //k是r2的初始指针
while((i<=mid)&&(j<=t))
{ k=k+1;
if(r[i].key<=r[j].key){r2[k]=r[i];i++;}
else{r2[k]=r[j];j++;}
}
while(i<=mid){k++;r2[k]=r[i];i++;}
while(j<=t){k++;r2[k]=r[j];j++;}
} //merge
Java实现的二路归并排序的算法如下
package com.chang;
import java.util.Arrays;
public class myMergeSort {
public static void main(String[] args) {
int[] li={26, 5, 98, 108, 28, 99, 100, 56, 34, 1};
printArray("排序前:",li);
guiBingSort(li);
printArray("排序后:",li);
}
private static void printArray(String pre,int[] a) {
System.out.print(pre+"\n");
for(int i=0;i<a.length;i++)
System.out.print(a[i]+"\t");
System.out.println();
}
public static void guiBingSort(int[] li){
System.out.println("开始排序");
mergeSort(li,0,li.length-1);
}
public static void mergeSort(int[] li,int l,int r){
if(l==r){
return;
}
int mid=l+((r-l)>>1);
//二路归并排序里面有两个Sort,多路归并排序里面写多个Sort就可以了
mergeSort(li,l,mid);
mergeSort(li,mid+1,r);
merge(li,l,mid,r);
}
static int number=0;
public static void merge(int[] li, int left ,int mid,int right){
//暂存数组
int[] temp=new int[li.length];
int tIndex=left;
int cIndex=left;
int r1=mid+1;
while(left<=mid && r1<=right){
if(li[left]<=li[r1]){
temp[tIndex++]=li[left++];
}else{
temp[tIndex++]=li[r1++];
}
}
while(left<=mid){
temp[tIndex++]=li[left++];
}
while(r1<=right){
temp[tIndex++]=li[r1++];
}
System.out.println("第"+(++number)+"趟排序:\t");
//将暂存数组中的内容拷贝到原数组
while(cIndex<=right){
li[cIndex]=temp[cIndex];
//输出中间归并排序结果
System.out.print(li[cIndex]+"\t");
cIndex++;
}
System.out.println("");
}
}
/*
排序前:
26 5 98 108 28 99 100 56 34 1
开始排序
第1趟排序:
5 26
第2趟排序:
5 26 98
第3趟排序:
28 108
第4趟排序:
5 26 28 98 108
第5趟排序:
99 100
第6趟排序:
56 99 100
第7趟排序:
1 34
第8趟排序:
1 34 56 99 100
第9趟排序:
1 5 26 28 34 56 98 99 100 108
排序后:
1 5 26 28 34 56 98 99 100 108
*/