数据结构常见排序算法代码实现
一、基本排序算法
1.冒泡排序
public class GuiBingTest {
public static void main(String[] args) {
int[] arr = {4,5,1,2,7,6,9,3,8};
//新建一个临时数组存放
int[] temp = new int[arr.length];
mergeSort(arr,0,arr.length-1,temp);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
}
public static void merge(int[]arr,int low,int mid,int high,int[] temp){
//辅助数组起始索引
int i=0;
//左右两组序列起始索引
int j = low,k=mid+1;
while (j<=mid && k<=high){
if (arr[j]<arr[k]){
temp[i++]=arr[j++];
}else {
temp[i++]=arr[k++];
}
}
//若左边还有剩余,全部拷贝到temp
while (j<=mid){
temp[i++] = arr[j++];
}
//若右边还有剩余,全部拷贝到temp
while (k<=high){
temp[i++] = arr[k++];
}
//把辅助数组拷贝到原数组
for (int l = 0; l < i; l++) {
arr[low+l] = temp[l];
}
}
public static void mergeSort(int[]arr,int low,int high,int[] temp){
if(low<high){
int mid =(low+high)/2;
//进行归并排序
mergeSort(arr,low,mid,temp);
mergeSort(arr,mid+1,high,temp);
merge(arr,low,mid,high,temp);
}
}
}
2.选择排序
public class XuanZeTest {
public static void main(String[] args) {
int[] arr = {4,5,1,2,7,6,9,3,8};
for (int i = 0; i <arr.length-1 ; i++) {
int minIndex = i;
for (int j = i+1; j <= arr.length-1; j++) {
if(arr[minIndex]>arr[j]){
minIndex=j;
}
}
swap(arr,i,minIndex);
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
}
public static void swap(int[] arr,int a,int b){
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
}
3.插入排序
public class ChaRuTest {
public static void main(String[] args) {
int[] arr = {4,5,1,2,7,6,9,3,8};
for (int i = 0; i < arr.length-1; i++) {
for (int j = i+1; j > 0 ; j--) {
if (arr[j-1]>arr[j]){
swap(arr,j-1,j);
}else{
break;
}
}
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
}
public static void swap(int[] arr,int a,int b){
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
}
二、高级排序算法
1.希尔排序
public class XiErTest {
public static void main(String[] args){
int[] arr = {4,5,1,2,7,6,9,3,8,5};
//对h进行确定
int h = 1;
while (h<arr.length/2){
h = 2*h+1;
}
while (h>=1){
//找到待插入元素
for (int i = h; i < arr.length; i++) {
//把待插入元素插入到有序数列中
for (int j = i; j >=h ; j-=h) {
if (arr[j-h]>arr[j]){
swap(arr,j-h,j);
}else {
break;
}
}
}
h=h/2;
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
}
public static void swap(int[] arr,int a,int b){
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
}
2.归并排序
public class GuiBingTest {
public static void main(String[] args) {
int[] arr = {4,5,1,2,7,6,9,3,8};
//新建一个临时数组存放
int[] temp = new int[arr.length];
mergeSort(arr,0,arr.length-1,temp);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
}
public static void merge(int[]arr,int low,int mid,int high,int[] temp){
//辅助数组起始索引
int i=0;
//左右两组序列起始索引
int j = low,k=mid+1;
while (j<=mid && k<=high){
if (arr[j]<arr[k]){
temp[i++]=arr[j++];
}else {
temp[i++]=arr[k++];
}
}
//若左边还有剩余,全部拷贝到temp
while (j<=mid){
temp[i++] = arr[j++];
}
//若右边还有剩余,全部拷贝到temp
while (k<=high){
temp[i++] = arr[k++];
}
//把辅助数组拷贝到原数组
for (int l = 0; l < i; l++) {
arr[low+l] = temp[l];
}
}
public static void mergeSort(int[]arr,int low,int high,int[] temp){
if(low<high){
int mid =(low+high)/2;
//进行归并排序
mergeSort(arr,low,mid,temp);
mergeSort(arr,mid+1,high,temp);
merge(arr,low,mid,high,temp);
}
}
}
未完待续