排序第一天,回忆关键字

  选择,插入,希尔,归并,快排(包括三向快排),堆排序。

  选择:

    实现原理:内外循环,选择最小,比较。

    关键点:for(k =i+1 ,k<N,k++){a[j]<a[min],min=j}

  插入:

     实现原理:往左插入最小

    关键点:for(int j = i+1, k > 0 && less(a[j],a[j-1],j--)

  希尔:

    实现原理:插入的改进,使用递增序列0,1,4,13………………,分组插入

    关键点:

    while(h<N/3){

      h=3*h+1;

     for(int j = i, j >= h && less(a[j],a[j-h],j=j-h)

       h=h/3;

    }

  归并:

    实现原理:原地,自顶向下,自底向上,递归,使整体分成小数组

    关键点:

      mergesort(a,lo,mid);

mergesort(a,mid+1,hi);

merge(a,lo,mid,hi);

for (int k = lo; k <= hi; k++)
if (i > mid)
a[k] = aux[j++];
else if (j > hi)
a[k] = aux[i++];
else if (SortUtils.less(aux[j], aux[i]))
a[k] = aux[j++];
else
a[k] = aux[i++];

}

快排:

 实现原理:选择a[lo]第一次,从右往左搜比他大,从左往右搜比他小,就是a[++i]、a[--j]与a[lo]=v对比,小于 大于,三项添加等于

 关键点:切分partition

while (SortUtils.less(a[++i], v))
if (i == hi)
break;
while (SortUtils.less(v, a[--j]))
if (j == lo)
break;
if (i >= j) {
break;
}

堆排序

   实现原理:优先队列,有序化,sink

   关键点:for用来构建堆有序,while使用来sink,从a[1]使用,后面exch和less减一

    

int N = a.length;
for (int i = N / 2; i >= 1; i--) {
sink(a, i, N);
}
while (N > 1) {
exch(a, 1, N--);
sink(a, 1, N);
}
}

private static void sink(Comparable[] a, int j, int n) {
while (2 * j <= n) {
int h = 2 * j;
if (h < n && less(a, h, h + 1)) {
h++;
}
if (!less(a, j, h)) {
break;
}
exch(a, j, h);
j = h;
}

}

    

时间: 2024-09-30 18:10:23

排序第一天,回忆关键字的相关文章

oracle获取排序第一的数据

一:按照某字段排序(时间,总数等),获取第一条 select a.* FROM ( select * from ( select t.*,row_number() over(partition by t.id order by t.createtime desc) rn from table t ) c where rn = 1) a where a.id= '001';--加上where条件是查询一条,不加是查询多条 二:如果是获取时间最新一条数据 SELECT * FROM table WH

常见的五类排序算法图解和实现(多关键字排序:基数排序以及各个排序算法的总结)

基数排序思想 完全不同于以前的排序算法,可以说,基数排序也叫做多关键字排序,基数排序是一种借助“多关键字排序”的思想来实现“单关键字排序”的内部排序算法. 两种方式: 1.最高位优先,先按照最高位排成若干子序列,再对子序列按照次高位排序 2.最低位优先:不必分子序列,每次排序全体元素都参与,不比较,而是通过分配+收集的方式. 多关键字排序 例:将下表所示的学生成绩单按数学成绩的等级由高到低排序,数学成绩相同的学生再按英语成绩的高低等级排序.        第一个关键字是数学成绩,第二个关键字是英

SQL 按关键字排序

SQL ORDER BY Keyword(按关键字排序) ORDER BY 关键字用于对结果集进行排序. SQL ORDER BY 关键字 ORDER BY 关键字用于按升序或降序对结果集进行排序. ORDER BY 关键字默认情况下按升序排序记录. 如果需要按降序对记录进行排序,可以使用DESC关键字. SQL ORDER BY 语法 SELECT column1, column2, ... FROM table_name ORDER BY column1, column2, ... ASC|

SQL ORDER BY 关键字:排序语法及案例剖析

SQL ORDER BY 关键字 ORDER BY 关键字用于对结果集进行排序. SQL ORDER BY 关键字 ORDER BY 关键字用于对结果集按照一个列或者多个列进行排序. ORDER BY 关键字默认按照升序对记录进行排序.如果需要按照降序对记录进行排序,您可以使用 DESC 关键字. SQL ORDER BY 语法 SELECT column_name,column_name FROM table_name ORDER BY column_name,column_name ASC|

十种常见的排序算法,面试算法必考

1.冒泡排序 已知一组无序数据a[1].a[2].……a[n],需将其按升序排列.首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变.再比较a[2]与a[3]的值,若a[2]大于a[3]则交换两者的值,否则不变.再比较a[3]与a[4],以此类推,最后比较a[n-1]与a[n]的值.这样处理一轮后,a[n]的值一定是这组数据中最大的.再对a[1]~a[n-1]以相同方法处理一轮,则a[n-1]的值一定是a[1]~a[n-1]中最大的.再对a[1]~a[n-2]以相同方

七大常见排序算法总结

文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 2016.04.06 lutianfei none V1.1 2016.07.16 lutianfei 增加了归并排序说明 V2.0 2016.07.19 lutianfei 完善了排序算法的总结 排序另一种分法 外排序:需要在内外存之间多次交换数据才能进行 内排序: 插入类排序 直接插入排序 希尔排序 选择类排序 简单选择排序 堆排序 交换类排序 冒泡排序 快速排序 归并类排序 归并排序 排序方法 平均情况 最好情况 最坏情况

三、基于交换的排序算法(冒泡排序和快速排序)

1.冒泡排序 基本思想:若从小到大排序,从头开始,两两比较,大的放在后面,将待排序元素从左到右比较一遍成为“一次冒泡”,每次冒泡都将待排序数列中最大的关键字交换到最后,直到所有元素有序为止. 算法复杂度:O(2^n) 改进方法:可能排序几次后,数列已经有序,但是还没有进行完n次循环.可以在交换的代码段中设置一个标志位,如果该标志位改变说明有交换(还未有序),否则用break退出循环. //1.冒泡排序 //注意数组下标溢出 void Bubble(int *array, int n) { int

十种JAVA排序算法实例

一.冒泡(Bubble)排序 复制代码 代码如下: void BubbleSortArray() {       for(int i=1;i<n;i++)       {         for(int j=0;i<n-i;j++) {               if(a[j]>a[j+1])//比较交换相邻元素                {                    int temp;                    temp=a[j]; a[j]=a[j+1]

堆排序(选择排序)-八大排序三大查找汇总(2)

二叉堆的定义 二叉堆是完全二叉树或者是近似完全二叉树. 二叉堆满足二个特性: 1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值. 2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆). 当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆.当父结点的键值总是小于或等于任何一个子节点的键值时为最小堆.下图展示一个最小堆: 堆的存储 一般都用数组来表示堆,i结点的父结点下标就为(i – 1) / 2.它的左右子结点下标分别为2 * i + 1和2 * i + 2.如