当前位置: 首页 > 编程日记 > 正文

数据结构(三) 用java实现七种排序算法。

很多时候,听别人在讨论快速排序,选择排序,冒泡排序等,都觉得很牛逼,心想,卧槽,排序也分那么多种,就觉得别人很牛逼呀,其实不然,当我们自己去了解学习后发现,并没有想象中那么难,今天就一起总结一下各种排序的实现原理并加以实现。

-WZY

一、文章编写风格总览

选择排序、插入排序、冒泡排序、归并排序、快速排序、希尔排序、堆排序、

最后对各种排序算法进行比较,理清楚各种排序的优缺点。

其中快速排序是冒泡排序的增强,堆排序是对选择排序的增强,希尔排序是对插入排序的增强,这就6种了,最后一种就是归并排序。

二、选择排序

选择排序是我认为最简单的一种排序了,因为我们自己也很容易想到这种方法对数组进行排序,原理非常简单,

原理图如上所示:先将第一个位值上的数跟之后所有位置上的数依次进行比较,如果第一个位置上的数比第二个位置上的数大,则进行互换,然后继续将第一个位置上的数与第三个位置上的数进行比较,经过一轮的比较后,第一个位值上的数就是所有数中最小的一个,接着将第二个位置上的数与之后所有位置上的数进行比较,同样的规则,第二轮比较结束后,第二位放的就是所有数中第二小的数,依次往下比,直到最后一个位置结束。按照这种方法进行排序,就叫做选择排序。

代码实现

测试

    //选择排序,将数组按从小到大排序public void selectSort(int[] array){//根据原理分析,使用两层循环即可实现for(int i=0; i<array.length; i++){//第一层for(int j=i+1; j<array.length;j++){    //第二层if(array[i] > array[j]){    //数据互换。将小的放前面int t = array[i];array[i] = array[j];array[j] = t;}}}}
View Code

舞蹈:http://v.youku.com/v_show/id_XMjU4NTY5NTcy.html

三、插入排序

简单,给定的一组记录,将其分为两个序列组,一个为有序序列(按照顺序从小到大或者从大到小),一个为无序序列,初始时,将记录中的第一个数当成有序序列组中的一个数据,剩下其他所有数都当做是无序序列组中的数据。然后从无序序列组中的数据中(也就是从记录中的第二个数据开始)依次与有序序列中的记录进行比较,然后插入到有序序列组中合适的位置,直到无序序列组中的最后一个数据插入到有序序列组中为止。

原理图

代码实现

    //插入排序,按从小到大的顺序public void insertSort(int[] array){/*** 理解插入排序的原理后,按照这样的思路进行编码*         用语言不好描述,具体可以查看插入排序的动态图*/int j,temp;        //temp:记录for(int i = 1; i < array.length; i++){if(array[i] < array[i-1]){temp = array[i];for(j = i-1; j>=0&&array[j]>temp; j--){array[j+1] = array[j];}array[j+1] = temp;}}}
View Code

很有趣的视频,插入排序的趣味舞蹈:http://v.youku.com/v_show/id_XMjU4NTY5MzEy.html

四、冒泡排序

冒泡排序跟选择排序一样的简单,好理解,整个过程就想气泡一样往上升,假设从小到大排序,对于给定的n个记录,从第一个记录开始依次对相邻的两个记录进行比较,当前面的记录大于后面的记录时,交换位置,进行一轮比较后,第n位上就是整个记录中最大的数,然后在对前n-1个记录进行第二轮比较,重复该过程直到进行比较的记录只剩下一个为止。

代码实现

    //冒泡排序,从小到大/*** 通过看冒泡排序的原理图,我们知道只要让其一直遍历数组即可,只不过每遍历一次,就要让遍历的长度减1,*     所有就在遍历的外面加一层while循环。判断的条件为,当遍历的长度>=1时,此时就只需要遍历两个数据了,比完后不应该在继续。*     非常简单的逻辑。* * @param array*/public void bubbleSort(int[] array){int j = array.length - 1;while( j >= 1){for(int i = 0; i < j; i++){if(array[i] > array[i+1]){int t = array[i];array[i] = array[i+1];array[i+1] = t;}}j--;}}
View Code

冒泡排序:http://v.youku.com/v_show/id_XMzMyOTAyMzQ0.html

五、归并排序

归并排序有两种实现方式,一种是非递归的,一种是递归的,但是我觉得如果你理解了非递归的实现,那么你就知道了归并排序的原理,而递归的也就非常简单了。

什么是归并排序呢?(我们讲解的是2路归并排序)

一张图就可理解什么叫做2路归并排序

初始将一个数组中每个元素都看成一个有序序列(数组长度为n),然后将相邻两个有序序列合并成一个有序序列,第一趟归并就可以得到n/2个长度为2(最后一个有序序列的长度可能是1,也可能不是,关键看数组中元素的个数了)的有序序列,在进行两两归并,得到n/4个长度为4的有序序列(最后一个的长度可能小于4)...一直这样归并下去,直到得到一个长度为n的有序序列1

简单来说,通过三步,解决三个问题,就可以写出归并排序

1、解决相邻两个有序序列归并成一个有序序列,非常简单,新增一个数组(长度和需要排列的数组相同),

二路归并的核心操作,在归并的过程中,可能会破坏原来的有序序列,所以,将归并的结果存入另外一个数组中,设两个相邻的有序序列为r[s] ~r[m]和r[m+1]~r[t],将这两个有序序列归并成一个有序序列,r1[s]~r1[t],设三个参数i,j,k。 i和j分别指向两个有序序列的第一个记录,即i=s,j=m+1,k指向存放归并结果的位置(也就是将归并结果放到r1中的哪个位置)k=s。然后,比较i和j所指记录的数,取出较小者作为归并结果存入k所指的位置,然后将较小者的指向往后移动,直至两个有序序列之一的所有记录都取完,在将另一个有序序列的剩余记录顺序送到归并后的有序序列中(也就是放到r1中)

    //一次归并/***         相邻两个有序序列归并成一个有序序列的过程* @param r        原数组,需要归并的数组* @param r1    新数组,归并后的数组* @param s        两个有序序列的第一个有序序列的第一个元素的下标* @param m        两个有序序列的第一个有序序列的最后一个元素的下标* @param t        两个有序序列的第二个有序序列的最后一个元素的下标*/public void merge(int[] r, int[] r1, int s, int m, int t){int i = s;    //两个有序序列的第一个有序序列的第一个元素的下标int j = m+1;    //两个有序序列的第二个有序序列的第一个元素的下标int k = s;        //新数组中的指向while(i <= m && j <= t){//两个有序序列都没有遍历完if(r[i] < r[j]){r1[k++] = r[i++];}else{r1[k++] = r[j++];}}//当其中一个序列遍历完之后,将剩下那个序列加到新数组中,判断是哪一个序列没有遍历完while(i <= m){r1[k++] = r[i++];}while(j<=t){r1[k++] = r[j++];}}
View Code

2、如何完成一趟归并?

这里就需要分情况了,三种情况,

假设每个有序序列中的元素个数为h(第一次归并的h=1),i=0,从第一个元素开始。归并每次取两个有序序列,那么跨度就是2h,问题就来了,只要知道长度为n(n为数组的最大下标值)的数组中有几个这样的两个有序序列,那么可以进行不同的操作了。

第一种情况:(i+2*h-1) <= n  //比如,i=0,h=1时,(i+2*h-1)的意思就是指向了第一个两个有序序列的最后一个位置的下标值,用它来跟n(n为数组最大的下标值)比较,如果小于n,那么说明后面还有别的数,如果等于n,说明到结尾了,整个数组正好全是两个有序序列得,不会有多余数。那么就执行一次归并,将这两个有序序列归并,然后i加2h。如果还符合这个条件,继续归并,如果不符合,判断别的情况。

第二种情况:(i+h-1) < n //说明最后还有两个有序序列,但是最后一个有序序列的长度不是h,同样将其进行归并

第三种情况: (i+h-1) >= n //说明只剩下最后一个有序序列,则直接将其有序序列送到r1的相应位置。

    /*** 一趟归并排序* @param r    原数组,需要归并操作的数组* @param r1 新数组,归并好的数组* @param h 步长多少(有序序列中含有的元素个数)* @param n    数组长度(数组下标的最大值)*/public void mergePass(int[] r, int[] r1, int h, int n){//判断根据步长能分成多个有序序列,int i = 0;while((i+2*h-1) <= n){//待归并的两个相邻有序序列的长度均为h,需要理解(i+2*h-1)的意思。merge(r,r1,i,i+h-1,i+2*h-1);//需要注意一次归并需要的参数i += 2*h;            }if(i+h-1 < n){//说明最后还有两个序列,第一个序列长度为h,第二个序列长度小于hmerge(r,r1,i,i+h-1,n);i += 2*h;}else{//剩下最后一个序列,长度并且小于或等于h,不用归并了,直接放入新数组中for(; i<=n; i++){r1[i] = r[i];}}}
View Code

3、完成整个归并排序

前面我们解决了两个问题,一个是两个有序序列如何进行归并,一个是如何判断完成一趟归并过程。现在就需要解决如何控制二路归并的结束呢?也就是需要归并多少趟。

当步长等于n或者大于n时,说明只剩下一个有序序列了,那么即归并结束了。

    //二分归并排序非递归算法//n:数组最大下标public void mergeSort(int[] r, int[] r1,int n){int h = 1;    //从1开始排序while(h<n){    //直到h>=n才结束,也就步长小于n时都要进行归并mergePass(r,r1,h,n);    //一趟归并h = 2*h;mergePass(r1,r,h,n);//因为经过一趟归并后,r1就变为了那个需要归并的数组,那么r就充当新数组,并且这也能够让排序好的数组放回到r数组中h = 2*h;            }}
View Code

六、快速排序

快速排序是对冒泡排序的增强,增强得点在于:冒泡排序中,记录的比较和移动是在相邻两个位置进行的,记录每次交换只能后移一个位置,因而总的比较次数和移动次数较多,而快排记录的比较和移动是从两端向中间进行的,较大的记录一次就能从前面移动到后面,较小的记录一次就能从后面移动到前面,这样就减少了比较次数和移动次数

快速排序原理:选取一个轴值(比较的基准),将待排序记录分为独立的两个部分,左侧记录都是小于或等于轴值,右侧记录都是大于或等于轴值,然后分别对左侧部分和右侧部分重复前面的过程,也就是左侧部分又选择一个轴值,又分为两个独立的部分,这就使用了递归了。到最后,整个序列就变得有序了。

问题:如何选择轴值?如何将序列变成左右两部分?

轴值的选择有三种:

1、选取序列的第一个位置上的记录

2、选择序列的中间位置上的记录

3、将序列第一个位置 和 中间位置 和 末尾位置上的记录进行比较,选择大小居中的记录,

如何将序列划分成左右两部分?

看图的执行流程,当一趟比较下来,轴值的左侧和右侧就被排好了,其中利用了first和end两个参数,一个从起点开始,一个从末尾开始,当两个相等时,就将序列中所有记录都遍历了一遍,第一次的比较次数是和选择排序第一次比较次数是一样的,但是之后就开始不一样了,因为在轴值的左侧的元素就不用跟轴值右侧的元素进行比较了,而选择排序还是跟所有的比。

递归调用

    /** 对序列划分为左右两个部分,* 轴值为数组第一个元素* i,first:指向需要进行左右两侧排序的序列的第一个位置* j,end:指向需要进行左右两侧排序的序列的最后一个位置*/public int Partition(int[] array, int first, int end){int i = first;int j = end;while(i < j){        //i和j会慢慢往中间靠,当i==j时,说明已经排好左右两侧的数据了,这里为什么不写i!=j作为条件呢?原因是有些情况是first>end,比如first=0,而end=-1,while(i<j&&array[i] < array[j]){//右侧进行扫描,array[i]是轴值j--;    //最后一个元素是大于轴值的,那么就不动,因为已经在其右边的,j--,往前移动一个位置
            }if(i < j){    //这一步是当array[i] > array[j]。轴值的位置变为了jint temp = array[i];array[i] = array[j];array[j] = temp;i++;}while(i<j&&array[i] < array[j]){//左侧扫描,如果都比轴值小的话,i往后移动i++;}if(i < j){    //当发现有比轴值大的数时,进行互换int temp = array[i];array[i] = array[j];array[j] = temp;j--;        }}return j;}public void quickSort(int[] array, int first, int end){if(first < end){int pivot = Partition(array,first,end);    //返回轴值的位置,quickSort(array,first,pivot-1);//第一次排好后,pivot-1就是左侧最尾部的位置quickSort(array,pivot+1,end);    //pivot+1,右侧最开始的位置。
        }}
View Code

快速排序:http://v.youku.com/v_show/id_XMzMyODk4NTQ4.html

七、希尔排序

希尔排序其实是插入排序的升级版本,本质上进行的也是插入排序的操作,但是希尔排序并不是把一组记录看成一个整体,而将整个记录分为了若干组记录,然后在对每组记录进行插入排序,

分组规则为如下所示:假设有 1 2 3 4 5  6 7 8 9 10 十个位置(每个位置上都会放数,这里忽略数,只讨论位置)。(省略了插入排序操作,只对如何分组进行讲解,而完整的希尔排序就是在每次分组完之后进行插入排序操作即可)

步长为:5、3、1

第一次分为5组记录(组数跟步长是一样的):1,6 、2,7、3,8、 4,9、 5,10 这五组记录,分别对这五组记录进行插入排序。

第二次分为3组记录:1,4,7,10、2,5,8、3,6,9 这三组记录,分别对这三组记录进行插入排序

第三次分为1组记录:1 2 3 4 5 6  7 8 9 10, 为这组记录进行插入排序,

而步长只要满足最后一次为1,并且是从大到小即可。一般使用(数组长度/2) 或者 (数组长度/3 +1) 来代表步长。

这样做的好处是:

将待排序的数组元素分成多组,每组中记录数相对较少

经过前几次的排序后,整个序列变为了“基本有序序列”,最后在对所有元素进行一次直接插入排序。

直接插入排序对基本有序和记录数少的序列的效率是非常高的,而希尔排序就是利用了这两点。

原理图

解释:第一次分组,49,13、38,27、65,49、97,55、76,04  五组,对这五组分别进行插入排序,在49找到13时,就会进行插入排序,位置会进行互换,而并非先全部分组,后排序。

按照步长一直重复执行,直到步长为1后,执行完最后一次直接插入排序,整个希尔排序就完成了。

运行时动态图:看最下面我分享的资源即可。(不知道博客园中如何上传.swf文件,或者动态图也不会如何上传。无奈)

代码实现

    public void shellSort(int[] array){int i,j,temp;    //i,j分别为for循环中的控制变量 temp作用是临时记录数int length = array.length;int gap = length;do{gap = gap/2;    //步长, 假设length为10,则步长为5 2 1for(i = gap; i<length; i++){if(array[i] < array[i-gap]){temp = array[i];for(j = i-gap; j>=0 && array[j]>temp; j-=gap){array[j+gap] = array[j];}array[j+gap] = temp;}}}while(gap>0);}
View Code

希尔排序舞蹈:http://v.youku.com/v_show/id_XMjU4NTcwMDIw.html

八、堆排序

上面说的希尔排序是对插入排序的增强,那么堆排序呢,就是对选择排序进行增强,选择排序一个数据要跟每个数据都进行一次比较,并没有利用到一些比较的结果,比如,4 跟10比较,3跟4比较后,按理说不用让3跟10在比了,但是选择排序并没有这种智能化,而是老老实实的比较,而堆排序就完美的利用了前几次比较的结果,从而增加了效率。

讲解堆排序之前,必须要知道什么是堆?

堆是一颗完全二叉树,什么是完全二叉树?只有最下面的两层结点度能够小于2,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树(还不懂就去百度一下什么是完全二叉树)

这个图是一个完全二叉树,但不是堆。

堆分两种,大顶堆和小顶堆

大顶堆:在完全二叉树的基础上,每个父节点都比自己的两个子结点大,这样的就是大顶堆,特点是根节点是最大的值,看下图,90比70,80大,70比60,10大,以此类推

小顶堆:和大顶堆相反,根节点是最小的值,并且每个父结点都比自己的子节点要小,如下图

堆排序就是利用堆的这种特点进行编写的,原理:先将一组拥有n个元素的序列构建成大顶堆或者小顶堆,在将根结点上的数跟堆最后一位数进行互换,此时,第n位的数就是整个序列中最大或者最小的数了,然后在将前n-1位元素进行构建成大顶堆或者小顶堆,在将根结点跟第n-1位进行互换,得到第2大或者第2小的数,在将前n-2位数进行构建,依次类推,直到只剩下1位元素即结束,排序完成。

通过讲解原理:堆排序分为三步

1、构建大顶堆或小顶堆

2、循环

根节点和末尾结点进行互换,

构建大顶堆或小顶堆

3、排序完成

 1     /*
 2      * 要知道什么是堆这种数据结构
 3      *         堆是一颗完全二叉树。分为大顶堆和小顶堆,
 4      *         大顶堆,每个父结点都比自己的子节点大,也就是根结点为最大
 5      *         小顶堆,每个父结点都比自己的子节点小,也就是根结点最小。
 6      * 按照大顶堆和小顶堆这种特点,将一个无序的n个记录的序列构建成大顶堆,将根节点上的数与最后一个
 7      * 结点n进行交换,然后在对n-1个记录进行构建大顶堆,继续把根节点与最后一个结点(n-1)互换,继续上面的操作。
 8      *         从小到大排序,则使用大顶堆
 9      *         从大到小排序,则使用小顶堆
10      *     从小到大
11      */
12     public void heapSort(int[] array){
13         //第一步:将数组构建成一个大顶堆 
14         int length = array.length;    //length为数组的长度,有几个数就是几,不要跟数组最大的下标值搞混淆了,有10个数,length就是10,数组最大下标为9
15         //找到完全二叉树中的最后一个父结点(拥有子结点)的位置length/2,也就是最后一个父节点是在完全二叉树的第length/2的位置上,但是在数组中的位置是 (length/2)-1,它代表父节点在数组中的位置
16         for(int i = length/2-1; i >= 0; i--){//依次遍历每一个父节点,比如最后一个父节点是4,那么它前面所有结点都是父节点,都需要进行构建
17             adjustMaxHeap(array,i,length);    //无序序列,所以需要从下往上全部进行构建。该方法做的事情就是,比较找到父节点,和两个子节点中最大的数放置到父节点的位置上。
18         }
19         //第二步:构建好了大顶堆后,将第一个数与最后一个进行互换,互换后继续调整大顶堆,
20         for(int i = length-1; i > 0; i--){
21             wrap(array, 0, i);        //互换数据,提取出来了。互换数据后,就已经不在是大顶堆了,需要重新进行构建
22             adjustMaxHeap(array, 0, i);    //从上往下,因为基本上都已经有序了,没必要在从下往上重新进行构建堆了,这就利用了前面比较的结果,减少了很多次比较。
23         }
24     }
25     
26     //互换数据
27     private void wrap(int[] array, int i, int j){
28         int temp = array[i];
29         array[i] = array[j];
30         array[j] = temp;
31     }
32     
33     
34     /**
35      *             构建大顶堆的操作,
36      *         父节点和其左右子节点的大小比较和互换,每次将父结点的位置和数组传进来,
37      *         就能构建出大顶堆了。
38      * 
39      * @param array    排序数组
40      * @param s    当前所指父节点在数组中位置(下标)
41      * @param length 数组的长度。用来判断父节点的两个子节点是否存在。
42      *         父节点和左子结点的关系: 2s+1
43      *         父结点和右子结点的关系: 2s+2
44      */
45     private void adjustMaxHeap(int[] array, int s, int length) {
46         int temp = array[s];
47         int child;            //代表更大一方的子节点的数组下标
48         //2s+1 是左子节点在数组中的位置,本来s+1是父节点在二叉树中的位置,2*(s+1) 是左子节点在二叉树中的位置,那么左子节点在数组中的位置为2*(s+1)-1,简化就为2s+1了
49         //为什么需要这个for循环?很多人不理解,觉得这个方法里只需要找到父节点和两个子结点最大的一个即可,这是因为忽略了一个小问题,看下面到152行的解释应该就明白了。
50         for(child=s*2+1; child <= length-1; child=child*2+1){    //child <= length-1 说明肯定有子节点,如果child=length-1,说明只有左结点
51             
52             if(child < length-1&&array[child] < array[child+1]){//child<length-1,就说明肯定右子结点,将其进行比较,找出大的一方的数组下标
53                 child++;    //变成右子节点所在数组中的下标,找到那个较大的子节点
54             }
55             if(array[child] > temp){    //将子节点(可能是左结点,也可能是右结点,就看上面这个判断了)与父节点进行比较,子节点大的话,将大的赋给父节点
56                 array[s] = array[child];    
57             }else{        //父节点大,什么也不做,跳出这层循环。
58                 break;
59             }
60             
61             array[child] = temp;    //父结点变为最大时,要将原先的父节点的值给现在的子节点。
62             s = child;        //因为子节点的值变了,那么就不知道这个子节点在他自己的两个子节点中是否还是最大,所以需要将该子节点的数组下标给s,去重新检测一遍。只有当父节点为最大时,才会执行break退出循环。
63             
64         }
65 
66 
67         
68     }
View Code

九、总结比较各种排序算法的优缺点

1、注意,排序的稳定性的意思是:举例说明。

排序前:5,6(1),1,4,3,6(2),(第一个6在第二个6之前)

                排序后:如果排序后的结果是1,2,3,4,5,6(1),6(2)那么就说此排序算 法是稳定的,反之为不稳定

2、当待排序记录个数n较大,并且是无序序列,对稳定性不作要求时,采用快速排序为宜

3、当待排序记录个数n较大,内存空间允许,要求排序稳定时,采用归并排序

4、当待排序记录个数n较大,且序列中可能出现正序或逆序的情况,不要求稳定性,采用堆排序或归并排序为宜

5、等等。。。这种直接到百度上一搜,肯定会有人总结的,并且总结的肯定比我好,我就了解各种排序算法原理,如何用java进行实现,和基本的一点特性。对自己要求更高的同学则需要继续深入研究一下。。

转载于:https://www.cnblogs.com/whgk/p/6596787.html

相关文章:

Codeforces ECR50 div2题解

A&#xff1a;签到 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; #define ll long long ll read() {ll x0,f1;char cgetchar();while (c<0||…

开发ios的语言

iOS发展这么多年了&#xff0c;很多第三方语言都向开发一种自己的iOS&#xff0c;于是多种跨平台诞生了&#xff01; Object-c、swift&#xff1a; 当然是开发iOS的首先&#xff0c;毕竟是苹果自己的东西&#xff0c;也是最流行、最适合开发ios的&#xff0c;无论是UI库、性能、…

c语言程序设计分段定时器,单片机C语言编程定时器的几种表达方式

原标题&#xff1a;单片机C语言编程定时器的几种表达方式吴鉴鹰单片机开发板地址店铺&#xff1a;【吴鉴鹰的小铺】地址&#xff1a;【https://item.taobao.com/item.htm?_uukgdp5a7629&id524088004171】单片机C语言编程中&#xff0c;定时器的初值对于初学者真的是比较不…

上交2017计算机专业就业,上海交通大学计算机科学与工程系(CSE)

经过多轮的意向调整&#xff0c;最终确定的生产实习去向结果公示(请见附件)。原则上&#xff0c;经公示后结果不做调整。生产实习执行时间从7月24日到8月27日&#xff0c;请目前尚未就课题开展明细跟导师联系的同学在7月24日之前务必联系导师。一、实习报告要求1、从教务网站&a…

树上倍增求lca

嗯~ o(*&#xffe3;▽&#xffe3;*)o lca是树上两点的最近公共祖先。如果在同一个分支上就是更靠近根的那个点&#xff0c;否则就是大家一起向上走&#xff0c;第一次能都经过的那个点。 根据这两个性质&#xff0c;我们对于每次询问可以把一个向上走到根节点&#xff0c;标记…

ios app内嵌入http服务器

1.采用CocoaHTTPServer https://github.com/robbiehanson/CocoaHTTPServer 2.采用MongooseDaemon https://github.com/face/MongooseDaemon

编程模拟洗牌和发牌过程c语言,洗牌发牌模拟系统课程设计报告.doc

集美大学诚毅学院《高级语言程序设计》课程设计实验报告题目&#xff1a;洗牌和发牌模拟专业&#xff1a;计算机科学与技术班级&#xff1a;姓名&#xff1a;成绩&#xff1a;指导教师&#xff1a;完成日期&#xff1a;2008 年 6月 26 日一、目的C语言进行程设计的能力&#xf…

使用complete的图片属性检测图片是否加载完毕

转载于:https://www.cnblogs.com/zclx/p/6652545.html

学金融买计算机配置,我是学金融投资的计算机等级考试哪个方向对我工作有用...

你好&#xff1a;你的这种情况应该是系统调整或服务器维护造成的&#xff0c;在这两天还有很多网友无法进入主页&#xff0c;请耐心等待&#xff0c;新浪工作日人员会尽快将系统恢复&#xff01; 祝顺利&#xff01;多出好文章&#xff01; 博客临时故障&#xff0c;用新浪各种…

NOIP2018TG 初赛复习

Date&#xff1a; 20180911 TCP/IP OSI7面向对象的程序设计语言 1.不是自顶向下2.simula 67语言 第一个3.继承性、封装性、多态性NOIP支持的语言环境&#xff1a;对于c / c &#xff1a;Dev-Cpp \ RHIDE (DJGPP) &#xff08;推荐&#xff1a;Dev-Cpp&#xff09;对于pascal&am…

分裂游戏(bzoj 1188)

Description 聪聪和睿睿最近迷上了一款叫做分裂的游戏。 该游戏的规则试&#xff1a; 共有 n 个瓶子&#xff0c; 标号为 0,1,2.....n-1, 第 i 个瓶子中装有 p[i]颗巧克力豆&#xff0c;两个人轮流取豆子&#xff0c;每一轮每人选择 3 个瓶子。标号为 i,j,k, 并要保证 i < j…

rb c语言,C语言,RB和RBT什么区别啊???这里的typedef 什么作用???

满意答案guiyalm47042017.01.10采纳率&#xff1a;58% 等级&#xff1a;12已帮助&#xff1a;5026人1) #define是预处理指令&#xff0c;在编译预处理时进行简单的替换&#xff0c;不作正确性检查&#xff0c;不关含义是否正确照样带入&#xff0c;只有在编译已被展开的源程…

ios 项目的.gitignore

git作为代码管理工具&#xff0c;.gitignore文件用来忽略哪些哪些文件不用添加到仓库管理https://www.gitignore.io/ 这个网址输入变成语言会帮你生成常用的忽略文件如&#xff1a;IOS项目&#xff0c;输入Xcode、Object-C、Swift、C、C、git、svn生成&#xff1a;# Created by…

计算机一级ps2019,2019年计算机一级考试PS基础学习点子:PS菜单中英文对照表.docx...

2019 年计算机一级考试 PS 基础学习点子&#xff1a; PS 菜单中英文对照表PS菜单中英文对照表一、FileNew2.Open3.Open As4.Open RecentClose6.Save7.Save As8.Save for Web9.Revert10.Place11.ImportPDF ImageAnnotationsExportManage WorkflowCheck InUndo Check OutUpload T…

ffmpeg 常用命令

mp4中的h264编码&#xff0c;而h264有两种封装&#xff1a; 一种是annexb模式&#xff0c;传统模式&#xff0c;有startcode&#xff0c;SPS和PPS是在ES中&#xff1b;另一种是mp4模式&#xff0c;一般mp4、mkv、avi会没有startcode&#xff0c;SPS和PPS以及其它信息被封装在co…

re.sub用法

re.sub功能是对于一个输入的字符串&#xff0c;利用正则表达式&#xff0c;来实现字符串替换处理的功能返回处理后的字符串 re.sub共有五个参数 三个必选参数pattern,repl,string 两个可选参数count,flags pattern,表示正则中的模式字符串 反斜杠加数字&#xff08;\n&#xff…

标准c语言怎么绘图,C语言绘图问题

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼这是我写的程序&#xff0c;检查无误&#xff0c;但运行不了&#xff0c;不过我这水平也只能做到这份上了&#xff0c;求大神指教&#xff0c;以后我一定好好学习#include#include#include#includevoid main(){int a,b,c,d,a2,b2,c…

计算机操作培训主持词,魅力女性沙龙会主持词文稿.docx

魅力女性沙龙会主持词??性的学科、一项重要的经济管理工作&#xff0c;是加强经济管理&#xff0c;提高经济效益的重要手段&#xff0c; 经济管理离不开会计&#xff0c; 经济越发展会计工作就显得越重要。会计工作在提高经济在企业的经营管理中起着重要的作用&#xff0c;其…

面向对象的3大特性

1.封装 ****目的&#xff1a;为了使一个类更加安全 做法&#xff1a; ****1.将成员变量变为私有的2.再类中做方法来间接访问成员变量3.在方法中加入控制条件 //一个成员变量还是可以的&#xff0c;但是不适用于多个成员变量&#xff08;即可写也可读&#xff09; 1234567891011…

MySQL内存结构

实际上MySQL内存的组成和Oracle类似&#xff0c;也可以分为SGA&#xff08;系统全局区&#xff09;和PGA&#xff08;程序缓存区&#xff09;。 mysql>show variables like "%buffer%"; 一、SGA 1.innodb_buffer_bool 用来缓存Innodb表的数据、索引、插入缓冲、数…

FFmpeg介绍

---恢复内容开始--- FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec&#xff0c;为了保证高可移植性和编…

amp 保留指定位c语言,C语言位运算符学习

8种机械键盘轴体对比本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f;[Toc]概念位运算是指按二进制进行的运算。C语言提供了6个位操作运算符。这些运算符只能用于整型操作数&#xff0c;即只能用于带符号或无符号的char,short,int与lo…

计算机设备管理器不显示com,台式机设备管理器打开是空白怎么办_win10设备管理无法显示解决方法...

2015-06-15 14:08:22  浏览量&#xff1a;2252win7设备管理器空白怎么办&#xff1f;最近有用户反馈打开设备管理器的时候&#xff0c;发现win7设备管理器显示空白&#xff0c;该怎么处理这个问题&#xff1f;下面跟随小编脚步一起看看win7系统打开设备管理器空白的解决方法。…

用Django内置form组件实现注册

HTML页面代码块&#xff1a; 1 <!DOCTYPE html>2 <html lang"en">3 <head>4 <meta charset"UTF-8">5 6 <link rel"stylesheet" href"/static/bootstrap/css/bootstrap.min.css">7 <titl…

Mac上搭建Nginx + rtmp

介绍 nginx是非常优秀的开源服务器&#xff0c;用它来做hls或者rtmp流媒体服务器是非常不错的选择&#xff0c;本人在网上整理了安装流程&#xff0c;分享给大家并且作备忘。 安装步骤 1.先安装brew&#xff1a; /usr/bin/ruby -e "$(curl -fsSL https://raw.githubuserco…

关于 ListBox 自动换行

网络上搜不到能用的信息&#xff0c;在此记录一下我的方案。 思路是通过数据模板&#xff0c;达到换行的目的&#xff0c;如下&#xff1a; 1 <ListBox.ItemTemplate> 2 <DataTemplate> 3 <TextBlock Text"{Binding}" TextWrapping"…

c语言链表找姓,急啊!!!求救了 C语言编一个链表,输出姓名和学号就好

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#include#include#includetypedef struct Node{int data;struct Node *next;}AN;int data;AN *CreList(AN *head);AN *InsList(AN *head,int data);AN *DelList(AN *head,int data);void find(int value,AN *head);void De…

计算机审计 pdf,计算机审计第三章作业.pdf

1. 审计软件的审计实施阶段前&#xff0c;包括哪些内容&#xff1f;答&#xff1a; a. 项目管理b. 数据准备c. 审计准备2. 新建审计项目时&#xff0c;在“项目登记”界面里&#xff0c;在定义‘审计时限范围’时&#xff0c;可以创建多年度数据时间吗&#xff1f;答&#xff1…

c语言通讯录打电话,C语言实现简易通讯录 | 术与道的分享

#include #include #include #include #include #pragma warning (disable:4996)enum Contact //枚举变量{Quit, //默认为0&#xff0c;下面依次递增1Add, //1Delect, //2Select, //3Alter, //4Show, //5Empty, //6Sort //7};//打印菜单void menu(){printf("#############…

Excel向数据库插入数据和数据库向Excel导出数据

为了熟悉java里工作簿的相关知识点&#xff0c;所以找了“Excel向数据库插入数据和数据库向Excel导出数据”的功能来实现。 注意事项&#xff1a;1&#xff0c;mysql数据库&#xff1b; 2&#xff0c;需要导入的jar包有 jxl.jar&#xff0c;mysql-connector-java-5.1.22-bin.ja…