1.排序算法
原理:
寻找到一个base,将小于base的值放左边,大于base的值放右边
- 默认数组的第一个元素为base数据,即base = arr[0]
- 设置两个变量low,high,初始化low=0;high=arr.length-1
- 从后面往前搜索,high–,直至找到第一个小于base的元素arr[high],即arr[low]=arr[high]
- 然后从前面开始搜索,low++,找到第一个大于base的元素arr[low],将arr[high]=arr[low]
- 直至low=high,该位置就是base位置
- 重复上述步骤,第一趟找到的base作为下一趟的分界点
- 递归调用
private void quickSort(int[] array, int start, int end) {
if(start > end){
return;
}
int i = start
int j = end
int key = arrray[start]
while(i<j){
// 先从右边扫描
while(key<=array[j] && i <j ){
i++;
}
array[j]=array[i]
//
while(key>=array[j] && i <j){
j--
}
array[i]=array[j]
// 直至i=j,循环结束;此时mid=i为下一轮排序的基准元素
// 基数位置
array[start] = array[i]
array[i] = key
// 递归排序左边数据
quickSort(array, start, i - 1);
// 递归排序右边数据
quickSort(array, i + 1, end);
}
2. 归并排序
原理:
将待排序列分为若干子序列,每个子序列排序后,再将有序子序列合并
3. 冒泡排序
原理:
每次比较相邻两个元素,若将n个元素排序,则需要n-1趟
时间复杂度:O(N^2)
for(int i = 0;i<arr.length -1;i++){
for(j=0;i<arr.length-i;j++){
if(arr[j]>arr[j+1]){
arr[j],arr[j+1]=arr[j+1],arr[j]
}
}
}
4. 选择排序
原理:
- 从数组中找到最小的元素,和第一个位置交换
- 从第二个位置开始,找最小元素和第二个位置 交换
- 直至选出arr.length-1个较小的元素
public static void sort(int[] arr){
//总共要经过N-1轮比较
for(int i=0; i<arr.length-1; i++){
int min = i;
/每轮需要比较的次数
for(int j = i+1; j < arr.length; j++){
if(arr[j]<arr[min]){
min = j //记录目前能找到的最小值元素的下标
}
}
//将找到的最小值和i位置所在的值进行交换
if(i!=min){
int temp = arr[i]
arr[i]=arr[min]
arr[min]=temp
}
}
5.插入排序
原理:
把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列
public static int[] sort(int[] array){
int j;
//从下标为1的元素开始选择合适的位置插入,因为下标为0的只有一个元素,默认是有序的
for(int i = 1 ; i < array.length ; i++){
int tmp = array[i];//记录要插入的数据
j = i;
while(j > 0 && tmp < array[j-1]){//从已经排序的序列最右边的开始比较,找到比其小的数
array[j] = array[j-1];//向后挪动
j--;
}
array[j] = tmp;//存在比其小的数,插入
}
return array;
}