詳解桶排序算法的思緒及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" />
以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。