排序算法分为两种:比较算法、非比较算法
1、比较算法时间复杂度O(nlogn) ~ O(n^2)
冒泡排序、选择排序、插入排序、归并排序、堆排序
快速排序
2、非比较排序O(n)
计数排序、基数排序、桶排序
特点:排序算法的稳定性:如果Ai = Aj,排序前Ai在Aj之前,排序后Ai还在Aj之前,则称这种排序算法是稳定的
排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,前一个键排序的结果可以为后一个键排序所用
1)冒泡排序
冒泡排序算法的运作如下:
比较相邻的元素,如果前一个比后一个大,就把它们两个调换位置。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
#include <stdio.h>
// 分类 -------------- 内部比较排序
// 数据结构 ---------- 数组
// 最差时间复杂度 ---- O(n^2)
// 最优时间复杂度 ---- 如果能在内部循环第一次运行时,使用一个旗标来表示有无需要交换的可能,可以把最优时间复杂度降低到O(n)
// 平均时间复杂度 ---- O(n^2)
// 所需辅助空间 ------ O(1)
// 稳定性 ------------ 稳定
public class ArraySortTest {
public void sort(int[] n) {
//第一个for循环表示第几次循环
for(int i=1;i<n.length;i++) {
//第二个for循环表示该次循环进行几次比较
for(int j=0;j<n.length-i;j++) {
//判断比较是否进行换位
if(n[j]>n[j+1]) {
int temp = n[j];
n[j] = n[j+1];
n[j+1] = temp;
}
}
print(n);
}
}
public void print(int[] n) {
for(int i=0;i<n.length;i++)
//输出排完序的数组
System.out.print(n[i] + "\t");
System.out.println();
}
public static void main(String[] args) {
ArraySortTest s = new ArraySortTest();
//此处为需要排序的数组
int[] n = {
100,60,80,90,75,38};
s.sort(n);
s.print(n);
}
}
冒泡排序的改进方法:鸡尾酒排序
public class Sad {
public static void main(String[] args) {
int []array= {
32,21,54,64,12,9,89,34};
for(int i=0;i<array.length/2;i++)
{
for(int j=0;j<array.length-i-1;j++) {
if(array[j]>array[j+1])
{
int temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
}
}
for(int j=array.length-i-1;j>i;j--