选择排序:
public static void selectionSort(int[] arr) {
if(arr==null||arr.length<2){
return;
}
for (int i=0;i<arr.length-1;i++){
int minIndex=i;
for (int j=i+1;j<arr.length;j++){
if (arr[j]<=arr[minIndex]){
minIndex=j;
}
}
swap(arr,minIndex,i);
}
}
public static void swap(int[] arr, int i, int j) {
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
冒泡排序:
public static void bubbleSort(int[] arr) {
if (arr==null||arr.length<2){
return;
}
for (int i=arr.length-1;i>0;i--){
for (int j=0;j<i;j++){
if (arr[j]>arr[j+1]){
swap(arr,j,j+1);//注意这里传入的是下标
}
}
}
}
public static void swap(int[] arr, int i, int j) {
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
插入排序:
public static void insertionSort(int[] arr) {
if (arr==null||arr.length<2){
return;
}
for (int i=1;i<arr.length;i++){ //注意这里是小于arr.length
int j=i;
while (j>0&&arr[j]<arr[j-1]){ //注意这里j>0应该在前面
swap(arr,j,j-1);
j--;
}
}
}
public static void swap(int[] arr, int i, int j) {
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
在一个有序数组中,找某个数是否存在
public class Code04_BSExist {
public static boolean exist(int[] sortedArr, int num) {
int left=0;
int right=sortedArr.length-1;
int mid=(right-left)/2;
while(left<=right){ //注意是小于等于
if (sortedArr[mid]==num){
return true;
}else if (sortedArr[mid]>num){
right=mid-1;
mid=(right+left)/2; //注意是(left+right)/2
}else if(sortedArr[mid]<num){
left=mid+1;
mid=(right+left)/2;
}
}
return false;
}
public static void main(String[] args) {
int[] arr = {1, 2, 4, 6, 10, 20, 21, 33, 43, 54};
System.out.println(exist(arr, 20));
}
}
在一个有序数组中,找>=某个数最左侧的位置
public class Code05_BSNearLeft {
// 在arr上,找满足>=value的最左位置
public static int nearestIndex(int[] arr, int value) {
int left = 0;
int right = arr.length - 1;
int index = -1;
while (left <= right) {
int mid = (left + right) / 2;
if (arr[mid] >= value) {
index = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
return index;
}
public static void main(String[] args) {
int[] arr = {1, 2, 2, 3, 3, 3, 3, 3, 4 ,4 ,4,6};
System.out.println(nearestIndex(arr, 5));
}
}
局部最小值问题
public class Code09_FindOneLessValueIndex {
public static int getLessIndex(int[] arr) {
if (arr == null || arr.length == 0) {
return -1;
}
if (arr.length == 1 || arr[0] < arr[1]) {
return 0;
}
if (arr[arr.length - 1] < arr[arr.length - 2]) {
return arr.length - 1;
}
int left = 1;
int right = arr.length - 2;
while (left < right) {
int mid = (left + right) / 2;
if (arr[mid] > arr[mid - 1]) {
right = mid - 1;
} else if (arr[mid] > arr[mid + 1]) {
left = mid + 1;
} else {
return mid;
}
}
return left;
}
public static void printArray(int[] arr) {
for (int i = 0; i != arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
public static void main(String[] args) {
int[] arr = { 6, 5, 3, 4, 6, 7, 8 };
printArray(arr);
int index = getLessIndex(arr);
System.out.println("index: " + index + ", value: " + arr[index]);
}
}
一个数组中有一种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这种数
一个数组中有两种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这两种数
public class Code07_EvenTimesOddTimes {
public static void printOddTimesNum1(int[] arr) {
int err=0;
for (int i=0;i<arr.length;i++){
err=err^arr[i];
}
System.out.println(err);
}
public static void printOddTimesNum2(int[] arr) {
int err=0;
int err1=0;
for (int i=0;i<arr.length;i++) {
err1=err1^arr[i];
}
int end=err1&(~err1+1);
for (int i=0;i<arr.length;i++){
if ((end&arr[i])==0){
err=err^arr[i];
}
}
System.out.println(err);
System.out.println(err1^err);
}
public static void main(String[] args) {
int[] arr1 = { 3, 3, 2, 3, 1, 1, 1, 3, 1, 1, 1 };
printOddTimesNum1(arr1);
int[] arr2 = { 4, 3, 4, 2, 2, 2, 4, 1, 1, 1, 3, 3, 1, 1, 1, 4, 2, 2 };
printOddTimesNum2(arr2);
}
}