排序算法
冒泡排序
将数组中的元素两两交换比较,每一轮交换都可以将未排序序列中的最大值找出来,放在已排序的序列末尾。 该排序算法的时间复杂度稳定为O(n^2),空间复杂度为O(1)(直接在本数组上操作,不需要额外的存储空间)。 一种改进型的方法是判断某一轮循环中是否发生了元素交换,如果没有那么就表明排序已完成,不必在进行后续的排序。
void sort(int[] nums){
boolean hasChange = true;
for(int i=0; i < nums.length - 1 && hasChange; i++){
hasChange = false;
for(int j = 0; j < nums.length - 1 -i; j++){
if (nums[j] > nums[j + 1]){
swap(nums, j, j + 1);
hasChange = true;
}
}
}
}
插入排序
不断地从未排序的数组中取出元素,插入到已排序的数组中。冒泡排序经过每一轮的排序,数组后端的数是排好序的;插入排序经过每一轮的排序,数组前端的数是排好序的。 插入排序的时间复杂度是O(n^2),空间复杂度是n(1)
void sort1(int[] nums){
for(int i=1; i < nums.length; i++){
int current = nums[i];
for(int j = i -1; j >= 0; j--){
if (nums[j] < current){
nums[j + 1] = nums[j];
}else{
nums[j + 1] = current;
}
}
}
}
归并排序
采用分治的思想,将一个问题分为多个小问题来求解。 具体地: 1)先将一个数组分成两个子数组; 2)递归地将每个子数组分割成更小的数组,直到数组中的元素个数是一个 3)依次按照递归的顺序返回,不断地合并排好序的子数组,直到把整个数组排好序 归并排序的需要创建一个新的大小为n的数组用于保存合并结果,所以空间复杂度是O(n),时间复杂度是O(nlogn)
void mergeSort(int[] arr, int start, int end) {
if (start >= end){
return;
}
int mid = (start + end) /2;
mergeSort(arr, start, mid);
mergeSort(arr, mid + 1, end);
merge(arr, start, mid, end);
}
void merge(int[] arr, int start, int mid, int end) {
int tmpArr[] = new int[end - start + 1];
int left = start;
int right = mid + 1;
int k = 0;
while(left <= mid && right<= end){
if (arr[left] <= arr[right]){
tmpArr[k++] = arr[left++];
}else {
tmpArr[k++] = arr[right++];
}
}
while(left <=mid){
tmpArr[k++] = arr[left++];
}
while(right<=end){
tmpArr[k++] = arr[right++];
}
for (int m = 0; m < tmpArr.length; m++){
arr[m + start] = tmpArr[m];
}
}
快速排序
也是采用了分治思想, 1)选择其中一个元素作为基准数据, 2)将小于基准数据的放在左边,将大于基准数据的放在右边, 3)然后继续对左右两个子数组采用快速排序。当子数组的元素个数为1,也就排好了子数组。 空间福再度O(logn),平均时间复杂度O(nlogn)
void quitSort(int[] nums, int low, int height) {
if (low >= height){
return;
}
int p = partition(nums, low, height);
quitSort(nums, low, p - 1);
quitSort(nums, p + 1, height);
}
int partition(int[] nums, int low, int height) {
swap(nums, randRange(low, height), height);
int i, j;
for(i = low, j = low; j < height; j++){
if (nums[j] < nums[height]){
swap(nums, i++, j);
}
}
swap(nums, i, j);
return i;
}
|