1.算法的相关概念:
1. 排序:
假设含有n个记录的序列为{R1,R2,…,Rn},其相应的关键字序列为{K1,K2,…,Kn}。将这些记录重新排序为{Ri1,Ri2,…,Rin},使得相应的关键字值满足条Ki1<=Ki2<=…<=Kin,这样的一种操作称为排序。
2. 目的:
通常来说,排序的目的是快速查找。
3. 衡量排序算法的优劣:
1)时间复杂度:分析关键字的比较次数和记录的移动次数
2)空间复杂度:分析排序算法中需要多少辅助内存
3)稳定性:若两个记录A和B的关键字值相等,但排序后A、B的先后次序保持不变,则称这种排序算法是稳定的。
4. 排序算法分类:
主要分为内部排序和外部排序。
1)内部排序:整个排序过程不需要借助于外部存储器(如磁盘等),所有排序操作都在内存中完成。常见的十大内部排序有:
选择排序:直接选择排序,堆排序
交换排序:冒泡排序,快速排序
插入排序:直接插入排序,折半插入排序,Shell排序
归并排序,桶排序,基数排序
2)外部排序:参与排序的数据非常多,数据量非常大,计算机无法把整个排序过程放在内存中完成,必须借助于外部存储器(如磁盘)。外部排序最常见的是多路归并排序。可以认为外部排序是由多次内部排序组成。
5. 算法的5大特征:
有穷性,确定性,可行性,输入性,输出性。
1.冒泡排序:
public class Bubblesort class{
public static void main(String[] args){
int arr = new int[]{-20,-5,3,6,2,15,-7,-2,1};
for(int i = 0;i < arr.length - 1;i++){
for(int j = 0;j < arr.length - 1 - i;j++){
if(arr[j] > arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
}
2.快速排序:
具体过程参考Java的快速排序
主要代码如下:
public class QuickSort{
public static void quickSort(int[]arr,int low,int high){
int i;j;temp;t
if(low > high){
return;
}
i = low;
j = high;
temp = arr[low];
while(i < j){
while(i < j && temp <= arr[j]){
j--;
}
while(i < j && temp >= arr[j]){
i++;
}
if(i < j){
t = arr[j];
arr[j] = arr[i];
arr[i] = t;
}
}
//最后将基准为与i和j相等位置的数字交换
arr[low] = arr[i];
arr[i] = temp;
//递归调用左半数组
quickSort(arr, low, j-1);
//递归调用右半数组
quickSort(arr, j+1, high);
}
public static void main(String[] args){
int[] arr = {10,7,2,4,7,62,3,4,2,1,8,9,19};
quickSort(arr, 0, arr.length-1);
for (int i = 0; i < arr.length; i++){
System.out.println(arr[i]);
}
}
}