詳解桶排序算法的思緒及C++編程中的代碼完成。本站提示廣大學習愛好者:(詳解桶排序算法的思緒及C++編程中的代碼完成)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解桶排序算法的思緒及C++編程中的代碼完成正文
算法思緒懂得
我本身的懂得哈,能夠與網上說的有一些收支,年夜體都是異樣的道理
無序數組有個請求,就是成員附屬於固定(無限的)的區間,如規模為[0-9](測驗分數為1-100等)
例如待排數字
[6 2 4 1 5 9]
預備10個空桶,最年夜數個空桶
[6 2 4 1 5 9] 待排數組 [0 0 0 0 0 0 0 0 0 0] 空桶 [0 1 2 3 4 5 6 7 8 9] 桶編號(現實不存在)
1,次序從待排數組中掏出數字,起首6被掏出,然後把6入6號桶,這個進程相似如許:空桶[ 待排數組[ 0 ] ] = 待排數組[ 0 ]
[6 2 4 1 5 9] 待排數組 [0 0 0 0 0 0 6 0 0 0] 空桶 [0 1 2 3 4 5 6 7 8 9] 桶編號(現實不存在)
2,次序從待排數組中掏出下一個數字,此時2被掏出,將其放入2號桶,是幾就放幾號桶
[6 2 4 1 5 9] 待排數組 [0 0 2 0 0 0 6 0 0 0] 空桶 [0 1 2 3 4 5 6 7 8 9] 桶編號(現實不存在) 3,4,5,6省略,進程一樣,全體入桶後釀成下邊如許 [6 2 4 1 5 9] 待排數組 [0 1 2 0 4 5 6 0 0 9] 空桶 [0 1 2 3 4 5 6 7 8 9] 桶編號(現實不存在)
0表現空桶,跳過,次序掏出便可:
1 2 4 5 6 9
C++示例:
以下是桶排序的c++法式,個中應用了list自帶的sort函數。
#include<iostream> #include<list> #include<algorithm> using namespace std; void bucketsort(double* a, int n) { list<double>* b = new list<double>[n]; for (int i = 0; i < n; i++) { b[int(a[i])].push_back(a[i]); } for (int i = 0; i < n; i++) { b[i].sort(); } for (int i = 0,j=0; i < n; i++) { while (b[j].size() < 1)j++; a[i] = b[j].front(); b[j].pop_front(); } } int main() { double arr[] = {0.1,1.1,2.2,3.5,1.5,2.3,7.5,1.7}; int n = 8; bucketsort(arr, n); for (int i = 0; i < 8; i++) { cout << arr[i] << " "; } cout << endl; return 0; }
法式運轉成果:
彌補解釋三點
1,桶排序是穩固的
2,桶排序是罕見排序裡最快的一種,比快排還要快…年夜多半情形下
3,桶排序異常快,然則同時也異常耗空間,根本上是最耗空間的一種排序算法
mLockAdapter = new MyAdapter(true); lv_lock.setAdapter(mLockAdapter); mUnLockAdapter = new MyAdapter(false); lv_unlock.setAdapter(mUnLockAdapter);
3.已加鎖和未加鎖條目點擊事宜處置
holder.iv_lock.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //添加動畫後果,動畫默許長短壅塞的,所以履行動畫的同時,動畫以下的代碼也會履行 animationView.startAnimation(mTranslateAnimation);//500毫秒 //對動畫履行進程干事件監聽,監聽到動畫履行完成後,再去移除聚集中的數據,操作數據庫,刷新界面 mTranslateAnimation.setAnimationListener(new AnimationListener() { @Override public void onAnimationStart(Animation animation) { //動畫開端的是挪用辦法 } @Override public void onAnimationRepeat(Animation animation) { //動畫反復時刻挪用辦法 } //動畫履行停止後挪用辦法 @Override public void onAnimationEnd(Animation animation) { if(isLock){ //已加鎖------>未加鎖進程 //1.已加鎖聚集刪除一個,未加鎖聚集添加一個,對象就是getItem辦法獲得的對象 mLockList.remove(appInfo); mUnLockList.add(appInfo); //2.從已加鎖的數據庫中刪除一條數據 mDao.delete(appInfo.packageName); //3.刷新數據適配器 mLockAdapter.notifyDataSetChanged(); }else{ //未加鎖------>已加鎖進程 //1.已加鎖聚集添加一個,未加鎖聚集移除一個,對象就是getItem辦法獲得的對象 mLockList.add(appInfo); mUnLockList.remove(appInfo); //2.從已加鎖的數據庫中拔出一條數據 mDao.insert(appInfo.packageName); //3.刷新數據適配器 mUnLockAdapter.notifyDataSetChanged(); } } }); } });
4.法式鎖必需在辦事中去保護
①根本思緒
public class WatchDogService extends Service { private boolean isWatch; private AppLockDao mDao; private List<String> mPacknameList; private InnerReceiver mInnerReceiver; private String mSkipPackagename; private MyContentObserver mContentObserver; @Override public void onCreate() { //保護一個看門狗的逝世輪回,讓當時刻監測如今開啟的運用,能否為法式鎖中要去攔阻的運用 mDao = AppLockDao.getInstance(this); isWatch = true; watch(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("android.intent.action.SKIP"); mInnerReceiver = new InnerReceiver(); registerReceiver(mInnerReceiver, intentFilter); //注冊一個內容不雅察者,不雅察數據庫的變更,一旦數據有刪除或許添加,則須要讓mPacknameList從新獲得一次數據 mContentObserver = new MyContentObserver(new Handler()); getContentResolver().registerContentObserver( Uri.parse("content://applock/change"), true, mContentObserver); super.onCreate(); } class MyContentObserver extends ContentObserver{ public MyContentObserver(Handler handler) { super(handler); } //一旦數據庫產生轉變時刻挪用辦法,從新獲得包名地點聚集的數據 @Override public void onChange(boolean selfChange) { new Thread(){ public void run() { mPacknameList = mDao.findAll(); }; }.start(); super.onChange(selfChange); } } class InnerReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { //獲得發送播送進程中傳遞過去的包名,跳過次包名檢測進程 mSkipPackagename = intent.getStringExtra("packagename"); } } private void watch() { //1,子線程中,開啟一個可控逝世輪回 new Thread(){ public void run() { mPacknameList = mDao.findAll(); while(isWatch){ //2.監測如今正在開啟的運用,義務棧 //3.獲得activity治理者對象 ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); //4.獲得正在開啟運用的義務棧 List<RunningTaskInfo> runningTasks = am.getRunningTasks(1); RunningTaskInfo runningTaskInfo = runningTasks.get(0); //5.獲得棧頂的activity,然後在獲得此activity地點運用的包名 String packagename = runningTaskInfo.topActivity.getPackageName(); //假如義務棧指向運用有切換,將mSkipPackagename空字符串 //6.拿此包名在已加鎖的包名聚集中去做比對,假如包括次包名,則須要彈出攔阻界面 if(mPacknameList.contains(packagename)){ //假如如今檢測的法式,和解鎖了,則不須要去彈出攔阻界面 if(!packagename.equals(mSkipPackagename)){ //7,彈出攔阻界面 Intent intent = new Intent(getApplicationContext(),EnterPsdActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra("packagename", packagename); startActivity(intent); } } //睡眠一下,時光片輪轉 try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } }; }.start(); } @Override public IBinder onBind(Intent arg0) { return null; } @Override public void onDestroy() { //停滯看門狗輪回 isWatch = false; //刊出播送接收者 if(mInnerReceiver!=null){ unregisterReceiver(mInnerReceiver); } //刊出內容不雅察者 if(mContentObserver!=null){ getContentResolver().unregisterContentObserver(mContentObserver); } super.onDestroy(); } }
public class EnterPsdActivity extends Activity { private String packagename; private TextView tv_app_name; private ImageView iv_app_icon; private EditText et_psd; private Button bt_submit; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //獲得包名 packagename = getIntent().getStringExtra("packagename"); setContentView(R.layout.activity_enter_psd); initUI(); initData(); } private void initData() { //經由過程傳遞過去的包名獲得攔阻運用的圖標和稱號 PackageManager pm = getPackageManager(); try { ApplicationInfo applicationInfo = pm.getApplicationInfo(packagename,0); Drawable icon = applicationInfo.loadIcon(pm); iv_app_icon.setBackgroundDrawable(icon); tv_app_name.setText(applicationInfo.loadLabel(pm).toString()); } catch (NameNotFoundException e) { e.printStackTrace(); } bt_submit.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String psd = et_psd.getText().toString(); if(!TextUtils.isEmpty(psd)){ if(psd.equals("123")){ //解鎖,進入運用,告訴看門口不要再去監聽和解鎖的運用,發送播送 Intent intent = new Intent("android.intent.action.SKIP"); intent.putExtra("packagename",packagename); sendBroadcast(intent); finish(); }else{ ToastUtil.show(getApplicationContext(), "暗碼毛病"); } }else{ ToastUtil.show(getApplicationContext(), "請輸出暗碼"); } } }); } private void initUI() { tv_app_name = (TextView) findViewById(R.id.tv_app_name); iv_app_icon = (ImageView) findViewById(R.id.iv_app_icon); et_psd = (EditText) findViewById(R.id.et_psd); bt_submit = (Button) findViewById(R.id.bt_submit); } @Override public void onBackPressed() { //經由過程隱式意圖,跳轉到桌面 Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME); startActivity(intent); super.onBackPressed(); } }
5.隱蔽比來翻開的activity
<activity android:excludeFromRecents="true" android:name="com.itheima.mobilesafe.EnterPwdActivity" android:launchMode="singleInstance" />
以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。