java算法基础(一)
排序算法之选择排序
选择排序是从数组中取出一个元素与其他元素挨个比较,符合条件则替换位置。
public void selectionSort(int[] array){
//如果数组长度为零或者为1都是不用排序的,直接返回
if(array.length==0 || array.length == 1){
return;
}
// 遍历数组
for(int i=0,i<array.length-1,i++){
int index= i;
for(int j=0,j<array.length,j++){
if(array[j]<array[i]){
index = j;
}
}
exch(array, i, index);
}
}
/**
* 数组交换变量
* @param array 数组
* @param i 交换数据的下标
* @param index 交换数据的下标
*/
public void exch(int[] array,int i, int index){
//判断两个下标是否一样,不一样执行交换
if(index ^ i != 0){
int swap = array[i];
array[i] = array[index];
array[index] = swap;
}
}
对数器
对数器就作用就是怎么快速的帮我们验证我们写的算法是否正确。
实现一个随机样本产生器,实现对比的方法。比较最终结果是否一致。就类似于压测一样的作用
/**
* 生成随机的样本数组
*
* @param maxSize 最大值
* @param maxValue 最小值
* @return 随机数组
*/
public static int[] generateRandomSampleArray(int maxSize,int maxValue){
//生成随机数范围为【0,maxSize】
int arr = new int[(int) ((maxSize + 1) * Math.random()) ];
//给数组赋值
for(i=0;i<arr.length;i++){
//产生【-maxValue,maxValue】
arrt[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random());
}
return arr;
}
/**
* 拷贝数组
*
* @param arr 被拷数组
* @return 拷贝后数组
*/
public int[] copyArray(int[] arr){
if(arr == null) {
return new int[0];
}
return Arrays.copyOf(arr, arr.length);
}
/**
* 比较两个数组是否一致
*
* @param arr1 数组1
* @param arr2 数组2
* @return 布尔值
*/
public static boolean isEqual(int[] arr1, int[] arr2) {
//如果两个数组都为空返回true
if(arr1 == null && arr2 == null){
return true;
}
//两个数组中有一个为空,则为false,不一致
if((arr1 != null && arr2 == null ) || (arr1 == null && arr2 != null) || (arr1.length != arr2 length)){
return false;
}
for(int i=0, i<arr1.length;i++){
if(arr1[i] != arr2[2]){
return false;
}
}
return true;
}
//对数器的用法
public static void main(String[] args) {
//定义数组的大小
int maxSize = 100;
//数组的最大最小值
int maxValue = 100;
//定义一个标识
boolean flag = true;
//循环生成多次随机样本,进行比对
for (int i = 0; i < maxSize; i++) {
// 生成样本数组
int[] array = generateRandomArray(maxSize, maxValue);
//拷贝样本数组,这个做的目的是在两个独立的内存空间进行比较
int[] array1 = copyArray(array);
//我们自己写的选择排序算法
selectionSort(array);
//这个java自带的排序算法,这个算法是一定对的
Arrays.sort(array1);
if (Boolean.FALSE.equals(isEqual(array1, array))) {
flag = false;
break;
}
}
System.out.println(flag ? "Nice!" : "Fucking fucked!");
}
排序算法之冒泡排序
冒泡排序就是相邻的两个元素比较,直至最后一个。
public static void bubbleSort(int[] array) {
// 如果数组长度为0或者1,都是不用排序直接返回
if (array.length == 0 || array.length == 1) {
return;
}
for(int i = 0;i<array.length-1;i++){
for(int j = i+1;j<array.length-i-1;j++){
if(array[j] < array[i]){
ercExch(array, i, j);
}
}
}
}
/**
* 用异或实现不加变量的赋值
*
* @param array 数组
* @param i 交换数据的下标
* @param index 交换数据的下标
*/
public static void ercExch(int[] array,int i,int index ){
array[i] = array[i] ^ array[index];
array[index] = array[i] ^ array[index];
array[i] = array[i] ^ array[index];
}
对于异或的交换位置原理,相同为零
排序算法之插入排序
插入法排序原理
利用插入法对无序数组排序时,我们其实是将数组R划分成两个子区间R[1..i-1](已排好序的有序区)和R[i..n](当前未排序的部分,可称无序区)。插入排序的基本操作是将当前无序区的第1个记录R[i]插人到有序区R[1..i-1]中适当的位置上,使R[1..i]变为新的有序区。因为这种方法每次使有序区增加1个记录,通常称增量法。
插入排序与打扑克时整理手上的牌非常类似。摸来的第1张牌无须整理,此后每次从桌上的牌(无序区)中摸最上面的1张并插入左手的牌(有序区)中正确的位置上。为了找到这个正确的位置,须自左向右(或自右向左)将摸来的牌与左手中已有的牌逐一比较。
//解法一:将获取这个元素于手上数组的元素挨个比较,一旦发现符合就进行交换
public static void insertionSort(int[] array) {
for(int i = 0;i<array.length;i++){
for(int j = i;j < 0 ;j--){
if(array[j]<array[j-1]){
ercExch(array,j,j-1);
}
}
}
}
// 解法一对造成不必要的交换,导致浪费
// 解法二 将获取的元素暂存起来,让手中元素与之比较,符合就将,元素往右移,不符合则将该获取的元素插入在该下标中
private static void insertionSort(int[] array) {
for(int i = 0;i<array.length;i++){
int temp = i;
int j;
for(j = i;j < 0 && temp <array[j-1];j--){
array[j]=array[j-1];
}
array[j]=temp;
}
}