1、常用排序算法
1.插入排序:直接插入排序、二分法插入排序
直接插入排序:从第i个开始,假设前i个元素构成的子序列是排序的,然后第i个元素从子序列中找到位子插入(顺序查找),算法稳定
二分法插入排序:从第i个开始,假设前i个元素构成的子序列是排序的,然后第i个元素从子 序列中找到位子插入(二分法查找),算法稳定
2.交换排序:冒泡排序、快速排序
冒泡排序:每跑一趟把最大的元素交换到最后面(反之),算法稳定
快速排序:每跑一趟把第一个元素作为基准值,1小于基准值的放前面,2大于基准值的放后面,在基准值前面和后面的序列重复执行1、2,算法不稳定
3.选择排序:直接选择排序、堆排序
直接选择排序:每次选择一个最大的放在后面(反之),算法不稳定
2、代码实现
(1)直接插入排序
public class Zhijiecharu {
public static void main(String[] args) {
//直接插入排序
int a[] = {3,5,1,8,2};
for(int i=1; i<a.length; i++){
for(int j=0; j<i; j++){
if(a[i] < a[j]){
int y = 0;
y = a[i];
for(int k=i; k>j; k--){
a[k] = a[k-1];
}
a[j] = y;
}
}
}
//排序后
for(int i=0; i<a.length; i++){
if(i < (a.length-1)){
System.out.print(a[i]+",");
}
else{
System.out.println(a[i]);
}
}
}
}
(2)二分法插入排序
public class Erfenfacharu {
public static void main(String[] args) {
//二分法插入排序
int a[] = {3,5,1,8,2};
erfen(a);
//排序后
for(int i=0; i<a.length; i++){
if(i < (a.length-1)){
System.out.print(a[i]+",");
}
else{
System.out.println(a[i]);
}
}
}
public static void erfen(int a[]){
for(int i=1; i<a.length; i++){
int tem = a[i];
int low = 0, hight = i-1;
int mid = -1;
while(low <= hight){
mid=(low + hight)/2;
if(a[mid] > tem){
hight = mid - 1;
}else{
low = mid + 1;
}
}
for(int j=i-1; j>=low; j--){
a[j+1] = a[j];
}
a[low] = tem;
}
}
}
(3)冒泡排序
import java.util.*;
public class Maopao {
public static void main(String[] args) {
//冒泡排序
int a[] = new int[5];
Scanner s = new Scanner(System.in);
for(int i=0; i<a.length; i++){
a[i] = s.nextInt();
}
for(int i=0; i<a.length; i++){
for(int j=0; j<a.length-1-i; j++){
if(a[j] > a[j+1]){
int x = a[j+1];
a[j+1] = a[j];
a[j] = x;
}
}
}
System.out.print("排序后:");
for(int i=0; i<a.length; i++){
if(i < (a.length-1)){
System.out.print(a[i]+",");
}
else{
System.out.println(a[i]);
}
}
}
}
(4)快速排序
public class Kuaisu {
public static void main(String[] args) {
//快速排序
int a[] = {23,4,50,1,55,16,30,90};
kuai(a, 0, a.length-1);
System.out.println("排序后:");
for(int i=0; i<a.length; i++){
System.out.print(a[i]+",");
}
}
public static void kuai(int a[], int bejin, int end){
int i = bejin, j = end;
if(i >= 0 && i < a.length && j >= 0 && j < a.length && i < j){
int x = a[i];
while(i < j){
for(; j>i; j--){
if(a[j] < x){
a[i] = a[j];
i++;
break;
}
}
for(; i<j; i++){
if(a[i] > x){
a[j] = a[i];
j--;
break;
}
}
}
a[i] = x;
kuai(a, bejin, j-1);
kuai(a, i+1, end);
}
}
}
(5)直接选择排序
package com.paixu;
public class Zhijiexuanze {
public static void main(String[] args) {
//直接选择排序
int a[] = {5,2,100,8,200,3};
for(int i=0; i<a.length; i++){
int min=a[i];
for(int j=i; j<a.length; j++){
if(a[j] < min){
int x = min;
min = a[j];
a[j] = x;
}
}
a[i] = min;
if(i != 0) {
System.out.println(":第"+i+"次");
}
for(int h=0; h<a.length; h++){
System.out.print(a[h]+",");
}
}
}
}