描述一个动态优先级调度算法,优化了那几个部分?
动态优先是指进程的优先级可以根据进程的不断推进而改变,以取得更好的性能。对于动态优先,其优先级的变化取决于进程的等待时间和占有处理机时间的时间。即随着进程等待时间的增加,该进程的优先级将以某种速率增加。
这样的目的是为了让优先级较低的进程在等待足够多的时间后优先级提高,进而被调度。另一方面,当一个进程占有处理机时间不断增加时,优先级会以某种速率降低,目的在于在程序运行一段时间后,将处理机让给其他进程,以防止进程长期垄断CPU。
算法:插入排序的变体 --冒泡排序
算法思想:升序排序,把第一个元素与第二个元素比较,如果第一个比第二个大,则交换他们的位置。接着继续比较第二个与第三个元素,如果第二个比第三个大,则交换他们的位置….(邻近的数字两两进行比较,不断后移)我们对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样一趟比较交换下来之后,排在最右的元素就会是最大的数。所以每次都会有一个数字放在正确位置,最右端,次右端......
除去最右的元素,我们对剩余的元素做同样的工作,如此重复下去,直到排序完成。
为方便理解我还准备了动图:
如果还是不懂的话我还给你准备了优质的文章讲解:https://mp.weixin.qq.com/s/6mzB4X5D8AY9F20c_mlQFQ
#include<bits/stdc++.h> using namespace std; int a[10001]; void swap(int &x,int &y){ int temp; temp=x; x=y; y=temp; } int BubbleSort(int n){ for(int i=0;i<n-1;i++){ bool flag=true; for(int j=0;j<n-1-i;j++){ if(a[j]>a[j+1]){ //flag=false; swap(a[j],a[j+1]); flag=false; } } if(flag){ break; } } } int main(){ int k; cin>>k; while(k--) { int n=4; cout<<"原始数据为:"; for(int i=0;i<n;i++){ cin>>a[i]; } BubbleSort(n); cout<<"冒泡排序后:"; int i; for(i=0;i<n-1;i++){ cout<<a[i]<<" "; } cout<<a[n-1]<<endl; cout<<"-------------------"<<endl; } return 0; } /* 1、#include<bits/stdc++.h>几乎包含所有 2、单独写交换函数和冒泡排序,交换换地址, 冒泡需要注意循环终止条件,第一次是循环趟数,第二次是每次比较次数,手动计算,对应 核心思想,不符合顺序,就交换 3、通过标志位控制减少循环次数, 只要一趟排序中有交换说明还无序 ,而且每次循环开始都需要初始化,默认有序true, 如果一直能保持true,则有序,break跳出最外层循环,易错 */
性质:1、时间复杂度:O(n2) 2、空间复杂度:O(1) 3、稳定排序 4、原地排序
假如从开始的第一对到结尾的最后一对,相邻的元素之间都没有发生交换的操作,这意味着右边的元素总是大于等于左边的元素,此时的数组已经是有序的了,我们无需再对剩余的元素重复比较下去了。