8、排序
按照某个关键字的值进行排序。
不稳定排序
原数据:
70 30 40 60 30 80
稳定排序:在前面的数据会一直在前面
30 30 40 60 70 80
不稳定排序:在前面的数据,排序后不一定在前面
30 30 40 60 70 80
冒泡排序
频繁的比较和交换。它属于稳定排序。C语言嵌套for循环实现冒泡排序
空间复杂度:T(n)=O(n2)
时间复杂度:S(n)=O(1)
快速排序
冒泡排序的升级版,冒泡+分治+递归。它属于不稳定排序。
时间复杂度:
最坏的情况,取的基准数是最大和最小值:T(n)=O(n2)
最好的情况,取的基准数是中间值:T(n)=O(nlog2n)
空间复杂度:
S(n)=O(log2n)
代码实现:
public class KuaiPai { public static void main(String[] args) { //无序数组 int[] arr = {12,32,43,12,6,73,67,23}; System.out.println(Arrays.toString(arr)); //快速排序 quickSort(arr); System.out.println(Arrays.toString(arr)); } //对外调用的方法:快速排序 public static void quickSort(int[] arr){ int low = 0; int high = arr.length-1; quickSort(arr,low,high); } //内部使用递归完成排序的方法 private static void quickSort(int[] arr, int low, int high){ //当区域长度为1的时候,结束递归排序 if(low<high) { //1、分区:把数组分为两个区域,左边区域的值都小于arr[low],右边区域的值都大于arr[low] int index = partition(arr, low, high); //2、对左边的区域进行快速排序 quickSort(arr, low, index - 1); //3、对右边的区域进行快速排序 quickSort(arr, index + 1, high); } } /** * 把数组按照“比第一个元素大的数”、“比第一个元素小的数”分为左右两个区域。 */ private static int partition(int[] arr, int low, int high){ //1、确定左指针和右指针 int i = low; int j = high; //2、把第一个数作为基准值,取出来 int x = arr[i]; //3、实现分区操作,大于基准值的在左边,小于基准值的在右边 while (i<j){ //1、从右向左移动j,找到第一个小于基准值的数arr[j] while (arr[j]>x && i<j){ j--; } //2、把找到的数放入原来基准数的位置arr[i] if(i<j){ arr[i] = arr[j]; i++; } //3、从左往右移动i,找到第一个大于基准数x的值arr[i] while(arr[i]<x && i<j){ i++; } //4、把找到的数放入上次取出来的arr[j]位置上去 if(i<j){ arr[j] = arr [i]; j--; } } //4、把基准值放回去,放分区的中间 arr[i] = x; //5、放回分区的位置 return i; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步