目录
- 排序(sort)
-
- 关于算法的一些常识
-
-
-
- 1.算法的稳定性指定是,在排序前后,两个相等的元素的前后位置不变。
- 2.在数据基本有序的情况下,快排效果最差。
- 3.数据越有序,简单排序(简单插入,简单查找,冒泡)效果越好,复杂排序(快排)效果越差。
- 4.算法的平均使用空间,
- 5.稳定排序有:冒泡排序,插入排序,归并排序(合并排序),基数排序。
- —————— 不稳定排序有:选择排序,快速排序,堆排序,希尔排序。
- 6.关键字比较次数与记录的初始值无关的是:选择排序。
- 7.冒泡排序虽然是交换排序,也是广义上的选择排序,每轮排序后,都会找出最大或最小的元素,当需要找topN时,可以使用冒泡排序。
- 8.快速寻找TopN的几种算法,选择排序,冒泡排序,改进后的快速排序,堆排序。
-
-
排序(sort)
算法的时间复杂度和空间复杂度怎么算
排序算法有哪些种:
排序算法主要有比较类算法和非比较类算法;
比较类算法按照排序方式不同分为四种:
交换排序:这类算法的本质是,比较相邻元素(冒泡),或者两指针指向的元素(快排),满足条件,则交换。
冒泡排序:遍历n,每次将邻近的较大的数跟较小的数交换。
/**
* 冒泡排序
* 思想:从头到尾遍历一遍,两两比较,
* 遇到不满足条件的就进行交换,
* n-1轮遍历下来,数组就有序了。
* 特点:冒泡排序也是广义上的选择排序,
* 每次遍历,都能够找到满足条件的一个元素,
* 可以用来解决TopN类问题。
*
* @param list
*/
public static void Bubble_Sort(int list[]){
int temp;
for(int i=list.length;i>1;i--){
for(int j=0;j<i-1;j++){
if(list[j]>list[j+1]) {
temp = list[j];
list[j] = list[j + 1];
list[j + 1] = temp;
}
}
}
}
快速排序:定义一个标准,大于标准的放一边,小于标准的方另一边,再递归。
/**
* 快速排序
* 思想:1.从待排序元素中任取一个基准,通常是第一个元素,
* 2.将待选元素进行区分,将比基准大的元素放在它右边,比它小的放在它左边。
* 3.对左右两个分区重复以上步骤,完成排序。
* 特点:快排是冒泡排序的改进版,也是最好的一种内排序,
* 数组有序度越低,算法越有优势,
* 当数组有序度越高时,优先使用简单排序。
* @param list
*/
public static void Quick_Sort(int list[],int _left,int _right) {
int left = _left;
int right = _right;
int temp;
if (left <= right) {
temp = list[left];
while (left != right) {
while (right > left && list[right] >= temp)
right--;
list[left] = list[right];
while (left < right && list[left] <= temp)
left++;
list[right] = list[left];
}
list[right] = temp; //基准元素归位
Quick_Sort(list, _left