您的位置:首页 > 编程语言 > Java开发

直通BAT-排序1(冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、希尔排序)

2018-01-09 14:55 886 查看
时间复杂度为O(N^2)的排序算法

冒泡排序:

import java.util.*;

public class BubbleSort {
public int[] bubbleSort(int[] A, int n) {
// write code here
int temp;
for(int i = n - 1; i >= 0; i--) {
for(int j = 0; j < i; j++) {
if(A[j] > A[j + 1]) {
temp = A[j];
A[j] = A[j + 1];
A[j + 1] = temp;
}
}
}
return A;
}
}


选择排序

import java.util.*;

public class SelectionSort {
public int[] selectionSort(int[] A, int n) {
// write code here
int temp;
for(int i = 0; i < n; i++) {
for(int j = i + 1; j < n; j++) {
if(A[j] < A[i]) {
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
}
return A;
}
}


插入排序

import java.util.*;

public class InsertionSort {
public int[] insertionSort(int[] A, int n) {
// write code here
int temp;
for(int i = 0; i < n; i++) {
for(int j = 0; j < i; j++) {
if(A[i] < A[j]) {
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
}
return A;
}
}


时间复杂度为O(N*logN)的排序算法

归并排序

import java.util.*;

public class MergeSort {
public int[] mergeSort(int[] A, int n) {
// write code here
if(A == null || n < 2) {
return A;
}
process(A, 0, n - 1);
return A;
}
public static void process(int[] A, int left, int right) {
if(left == right) {
return;
}
int mid = (left + right) / 2;
process(A, left, mid);
process(A, mid + 1, right);
merge(A, left, mid, right);
}
public static void merge(int[] A, int left, int mid, int right) {
int[] help = new int[right - left + 1];
int l = left;
int r = mid + 1;
int index = 0;
while (l <= mid && r <= right) {
if (A[l] <= A[r]) {
help[index++] = A[l++];
} else {
help[index++] = A[r++];
}
}
while (l <= mid) {
help[index++] = A[l++];
}
while (r <= right) {
help[index++] = A[r++];
}
for (int i = 0; i < help.length; i++) {
A[left + i] = help[i];
}
}
}


快速排序

import java.util.*;

public class QuickSort {
public int[] quickSort(int[] A, int n) {
// write code here
if(A == null || n < 2) {
return A;
}
process(A, 0, n - 1);
return A;
}
public static void process(int[] A, int left, int right) {
if(left < right) {
int random = left + (int)(Math.random() * (right - left + 1));
swap(A, random, right);
int mid = partition(A, left, right);
process(A, left, mid - 1);
process(A, mid + 1, right);
}
}
public static int partition(int[] A, int left, int right) {
int pivot = left - 1;
int index = left;
while (index <= right) {
if (A[index] <= A[right]) {
swap(A, ++pivot, index);
}
index++;
}
return pivot;
}

public static void swap(int[] A, int index1, int index2) {
int tmp = A[index1];
A[index1] = A[index2];
A[index2] = tmp;
}
}


堆排序

import java.util.*;

public class HeapSort {
public int[] heapSort(int[] A, int n) {
// write code here
for(int i=n/2; i>=0; i--){
heapAdjust(A,i,n);
}

for(int i=n-1;i>0;i--){
swap(A,0,i);
heapAdjust(A,0,i);
}
return A;
}

void heapAdjust(int[] A,int index,int length){
int childLeft;
int temp = A[index];
for( ;index*2+1 < length;index = childLeft){
childLeft = index*2+1;
if(childLeft !=length-1 && A[childLeft] < A[childLeft+1]){
childLeft++;
}
if(temp > A[childLeft]){
break;

}
else {
A[index] = A[childLeft];
index = childLeft;
}
}
A[index] = temp;

}

static void  swap(int[] A,int m,int n){
int temp = A[m];
A[m] = A
;
A
= temp;
}
}


希尔排序

import java.util.*;

public class ShellSort {
public int[] shellSort(int[] A, int n) {
if(A == null || n < 2) {
return A;
}
int feet = n / 2;
int index = 0;
while(feet > 0){
for(int i = feet; i < n; i++) {
index = i;
while(index >= feet) {
if(A[index - feet] > A[index]) {
swap(A, index - feet, index);
index -= feet;
} else {
break;
}
}
}
feet /= 2;
}
return A;
}
public static void swap(int[] A, int index1, int index2) {
int temp = A[index1];
A[index1] = A[index2];
A[index2] = temp;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐