import org.junit.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class SortedNums {
public void bubbleSorted(int[] nums) {
if (nums.length < 2) {
return;
}
int index = 0;
for (int i = 0; i < nums.length - 1; i++) {
for (int j = 0; j < nums.length - i - 1; j++) {
if (nums[j] > nums[j + 1]) {
index = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = index;
}
}
}
}
public void quickSorted(int[] nums,int low,int high){
if (nums.length<2||nums==null){
return;
}
if (low<high) {
int index = getIndex(nums,low,high);
quickSorted(nums,low,index-1);
quickSorted(nums,index+1,high);
}
}
public int getIndex(int[] nums,int low,int high){
int num = nums[low];
while (low<high){
while (low<high && nums[high]>num){
high--;
}
nums[low] = nums[high];
while (low<high && nums[low]<num){
low++;
}
nums[high]=nums[low];
}
nums[low] = num;
return low;
}
public void selectSorted(int[] nums){
for (int i = 0; i < nums.length; i++) {
for (int j = i+1; j < nums.length; j++) {
if (nums[j]<nums[i]){
int index= nums[i];
nums[i]=nums[j];
nums[j]=index;
}
}
}
}
public void insertSorted(int[] nums) {
if (nums.length < 2 || nums == null) {
return;
}
int index = 0;
for (int i = 1; i < nums.length; i++) {
if (nums[i] < nums[i - 1]) {
index = nums[i];
for (int j = i; j >= 0; j--) {
if (j > 0 && nums[j - 1] > index) {
nums[j] = nums[j - 1];
} else {
nums[j] = index;
break;
}
}
}
}
}
public void shellInsert(int[] nums){
int index =0;
int len= nums.length;
for (index = len/2; index > 0; index/=2){
for (int i = index; i<len; i++){
shellSorted(index,i,nums);
}
}
}
public void shellSorted(int index,int i,int[] nums){
int temp = nums[i];
int j;
for (j = i-index; j>=0&&temp<nums[j]; j-=index){
nums[j+index] = nums[j];
}
nums[j+index]=temp;
}
public void mSort(int[] nums,int mid,int L,int R){
int[] temp = new int[R-L+1];
int i = 0;
int P1 = L;
int P2 = mid+1;
while (P1<=mid && P2<=R){
temp[i++] = nums[P1] < nums[P2] ? nums[P1++] : nums[P2++];
}
while (P1<=mid){
temp[i++] = nums[P1++];
}
while (P2<=R){
temp[i++] = nums[P2++];
}
for (int j = 0; j < temp.length; j++) {
nums[L+j] = temp[j];
}
}
public void merge(int[] nums,int L,int R){
if (L == R){
return;
}
int mid = (L+R)/2;
merge(nums, L, mid);
merge(nums, mid+1, R);
mSort(nums,mid,L,R);
}
public void mergeSort(int[] nums){
merge(nums,0,nums.length-1);
}
public void basicSort(int[] nums){
if (nums.length<2||nums==null){
return;
}
int max = 0;
int len = 0;
for (int i = 0; i < nums.length; i++) {
max = max < nums[i] ? nums[i] : max;
}
while (max>0){
max/=10;
len++;
}
List<ArrayList<Integer>> basicList = new ArrayList<>(10);
for (int i = 0; i < 10; i++) {
ArrayList<Integer> queue = new ArrayList<>();
basicList.add(queue);
}
for (int i = 0; i < len; i++) {
for (int j = 0; j < nums.length; j++) {
int index = nums[j]%(int)Math.pow(10,i+1)/(int)Math.pow(10,i);
basicList.get(index).add(nums[j]);
}
int count = 0;
for (int j = 0; j < basicList.size(); j++) {
while (basicList.get(j).size()>0){
nums[count] = basicList.get(j).get(0);
basicList.get(j).remove(0);
count++;
}
}
}
}
@Test
public void test() {
int[] arr = {55, 9, 4, 354, 87, 66, 1, 45, 3, 14, 86, 5};
basicSort(arr);
System.out.println(Arrays.toString(arr));
}
}
public static void sort(int[] arr){
for (int i = arr.length/2-1; i >= 0; i--){
adjust(arr, i, arr.length);
}
for (int j = arr.length - 1; j > 0; j--){
int temp = arr[0];
arr[0] = arr[j];
arr[j] = temp;
adjust(arr, 0, j);
}
}
public static void adjust(int[] arr, int index, int len){
int temp = arr[index];
for (int i = index*2+1; i <len; i = i*2+1){
if (i + 1 < len && arr[i] < arr[i+1]){
i++;
}
if (temp < arr[i]){
arr[index] = arr[i];
index = i;
}else {
break;
}
}
arr[index] = temp;
}