程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 詳解桶排序算法的思緒及C++編程中的代碼完成

詳解桶排序算法的思緒及C++編程中的代碼完成

編輯:關於C++

詳解桶排序算法的思緒及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,桶排序異常快,然則同時也異常耗空間,根本上是最耗空間的一種排序算法

�,刷新界面 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(); } } }); } }); return convertView; } }
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.法式鎖必需在辦事中去保護

①根本思緒

  1. 斷定以後開啟的運用(如今手機可見義務棧)
  2. 假如開啟的運用在已加鎖的列表中,彈出攔阻界面
  3. 看門狗辦事,一向(逝世輪回(子線程,可控))對開啟的運用做監聽
  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" />
    

    以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved