常见的算法
快速排序、冒泡排序,希尔排序,二分排序(二路归并)(nlogn),桶排序,堆排序,基数排序
插入,希尔,归并
选择,冒泡,快速
堆排序:
##分析算法的指标
1,时间效率
2,空间复杂度
3,比较次数和交换次数
4,稳定性
1 9 3 5 3
第一种:1 3 3 5 9
第二种:1 3 3 5 9
哪一种是稳定的?相同的两个数排完序后,相对位置不变。
意义:
电商里面订单排序:首先会按金额从小到大排,金额相同的按下单时间。我从订单中心过来的时候已经按照时间排好序了。
1插入排序
假设有个这样的问题:打扑克。分成两部分:一部分是你手里的牌(已经排好序),一部分是要拿的牌(无序)。把一个无序的数列一个个插入到有序数列中。一个有序的数组,我们往里面添加一个新的数据后,如何继续保持数据有序呢?我们只要遍历数组,找到数据应该插入的位置将其插入即可。
以上这种往一个有序的集合里面插入元素,插入后序列仍然有序这就是插入排序算法思路。理解起来不难吧。那么插入排序具体是怎么实现呢?
具体步骤如下:
1.将数组分成已排序段和未排序段。初始化时已排序端只有一个元素
2.到未排序段取元素插入到已排序段,并保证插入后仍然有序
3.重复执行上述操作,直到未排序段元素全部加完。
有几种数据结构,用什么数据结构来实现。数组,链表,2个数组。
package edu.sort;
import java.util.Arrays;
/**
* 归并排序
* 先对数据进行分段,分成一段段的连续的片段,然后采用插入排序进行
*
* @author: LHT
* @date: 2020/12/14 15:24
*/
public class MergeSort {
public static void main(String[] args) {
int[] data = {1, 4, 234, 63, 123, 56234, 21, 213, 4543};
mergeSort(data, 0, data.length - 1);
System.out.print(Arrays.toString(data));
}
public static void mergeSort(int data[], int left, int right) {
if (left < right) {
//拆分数组,如果想当,标示只有一个数了。不需要拆分了,
int mid = (left + right) / 2;
mergeSort(data, left, mid);
mergeSort(data, mid + 1, right);
//分完了接下来要合并
merge(data, left, mid, right);
}
}
/**
* 合并数据
*
* @param data 源数据
* @param left 拆分左右边的下标
* @param mid 拆分中间的下标
* @param right 拆分有点的下标
*/
public static void merge(int[] data, int left, int mid, int right) {
int temp[] = new int[data.length]; //借用临时数组存储合并好的数据
int point1 = left;//标示最右边的第一个数据
int point2 = mid + 1;//标示右边的第一个数的位置
int loc = left; //标记我们当前已经到了那个位置
while (point1 <= mid && point2 <= right) {
if (data[point1] < data[point2]) {
temp[loc] = data[point1];
point1++;
loc++;
} else {
temp[loc] = data[point2];
point2++;
loc++;
}
}
//合并数据
while (point1 <= mid) {
temp[loc++] = data[point1++];
}
while (point2 <= right) {
temp[loc++] = data[point2++];
}
//将排好序的数据,赋值给数组
for (int i = left; i <= right; i++) {
data[i] = temp[i];
}
}
}
package edu.sort;
/**
* 插入排序
*
* @author: LHT
* @date: 2020/12/14 14:44
*/
public class InsertionSort {
/**
* * 1.将数组分成已排序段和未排序段。初始化时已排序端只有一个元素
* * 2.到未排序段取元素插入到已排序段,并保证插入后仍然有序
* * 3,重复执行上述操作,直到未排序段元素全部加完。
* 循环次数:2,
* 时间复杂度:n^2
* 最好的情况 O(n)
* 最坏的情况 O(n^2)
* <p>
* 优化方案:分段
*
* @param a
*/
static int[] insertSort(int a[]) {
int n = a.length;
for (int i = 1; i < n; i++) {
int data = a[i];
int j = i - 1;
for (; j > 0; j--) {
if (a[j] > data) {
a[j + 1] = a[j];
} else {
break;
}
}
a[j + 1] = data;
for (j = 0; j < n; j++) {
System.out.print(a[j] + " ");
}
System.out.println(" 第" + i + "次排序结果");
}
return a;
}
public static void main(String[] args) {
int a[] = {1, 3, 6532, 235, 2135, 67, 2};
/**
* 插入排序
* 优化方案,希尔排序
* 再次优化方案
* 归并排序
*/
insertSort(a);
}
}