1.选择排序
对于一个int数组,请编写一个选择排序算法,对数组元素排序。
给定一个int数组A及数组的大小n,请返回排序后的数组。
测试样例:
[1,2,3,5,2,3],6
[1,2,2,3,3,5]
public class SelectionSort {
public int[] selectionSort(int[] A, int n) {
for(int i = 0; i < n - 1; i++){
int t = i;
for(int j = i ; j < n ; j++ ){
if(A[t] > A[j]){
t = j;
}
}
int temp;
temp = A[i];
A[i] = A[t];
A[t] = temp;
}
return A;
}
}
2.插入排序
对于一个int数组,请编写一个插入排序算法,对数组元素排序。
给定一个int数组A及数组的大小n,请返回排序后的数组。
测试样例:
[1,2,3,5,2,3],6
[1,2,2,3,3,5]
import java.util.*;
public class InsertionSort {
public int[] insertionSort(int[] A, int n) {
for(int i = 0; i < n; i++){
for(int j = i; j > 0 ; j--){
int temp;
if(A[j] < A[j-1]){
temp = A[j];
A[j] = A[j-1];
A[j-1] = temp;
}else{
break;
}
}
}
return A;
}
}
3.对于一个int数组,请编写一个归并排序算法,对数组元素排序。
给定一个int数组A及数组的大小n,请返回排序后的数组。
测试样例:
[1,2,3,5,2,3],6
[1,2,2,3,3,5]
import java.util.*;
public class MergeSort {
public int[] mergeSort(int[] A, int n) {
// write code here
sort(A,0,n-1);
return A;
}
public void sort(int []data, int left,int right){
if(left < right){
int middle = (left + right)/2;
//划分左右
sort(data,left,middle);
sort(data,middle + 1,right);
//合并划分
merge(data,left,middle,right);
}
}
//合并左右两个子数组
public void merge(int[] data, int left, int middle, int right){
//临时数组
int[] tempArr = new int[right-left+1];
//左边数组游标
int leftIndex = left;
//右边数组游标
int rightIndex = middle + 1;
//临时数组游标
int tempIndex = 0;
while(leftIndex <= middle && rightIndex <= right){
//临时数组选取左、右子数组中小数值
if(data[leftIndex] < data[rightIndex]){
tempArr[tempIndex++]=data[leftIndex++];
}else{
tempArr[tempIndex++]=data[rightIndex++];
}
}
//剩余的直接放入
while(leftIndex<=middle){
tempArr[tempIndex++]=data[leftIndex++];
}
while(rightIndex<=right){
tempArr[tempIndex++]=data[rightIndex++];
}
//将临时数组放回原数组相应位置
int temp = 0;
while((temp+left) <= right){
data[left+temp] = tempArr[temp];
temp++;
}
}
}
4.对于一个int数组,请编写一个快速排序算法,对数组元素排序。
给定一个int数组A及数组的大小n,请返回排序后的数组。
测试样例:
[1,2,3,5,2,3],6
[1,2,2,3,3,5]
import java.util.*;
public class QuickSort {
public int[] quickSort(int[] A, int n) {
// write code here
quickSort(A,0,n-1);
return A;
}
public void quickSort(int[] A, int start, int end){
if(start < end){
int index = partition(A,start,end);
if(start<index-1){
quickSort(A,start,index-1);
}
if(index<end){
quickSort(A,index+1,end);
}
}
}
public int partition(int[] A,int start,int end){
int pivot = A[(start+end)/2];
int index = start; //划分范围
int temp;
//交换到最后
temp = A[end];
A[end] = A[(start+end)/2];
A[(start+end)/2] = temp;
while(start < end){
if(A[start] < pivot){
temp = A[index];
A[index] = A[start];
A[start] = temp;
index++;
start++;
}else{
start++;
}
}
//开始交换
temp = A[index];
A[index] = A[end];
A[end] = temp;
return index;
}
}