這可能是我見過最詳細的快速排序!

關于快速排序,網上,和維基都有完成的解釋,他們都是。。。。。。,俺覺得都是,太過于總結話語在概述一些東西;

而我卻從最本質的東西,一步一步的深入;在深入的學習過程中,我得到如下非代碼層面上的感悟;

A.一個完整的模式(代碼或者其他東西)都是通過沒有=>part0=>part1=>part2>version0=>viersion1.......versionN=>perfect? 最后達到一個完成的形式;

如果你只是去學習和體會最后的那一個完成的版本,而沒有經歷整個探索的過程,你的體會也不會太多;

?

B.有時候要學會抽象化和跳躍化的去思考問題,而不是step by step(這有點不具體,下次我結合具體的實例來解釋)

?

C.幫助別人解決問題;并不是直接給出問題的答案或者結果;而是給別人一些引導和資源,讓他自己去解決;(這點來自使用stackoverflow提問的感受)

?

D.還有第四點,要學會從特殊(具體)到一般(抽象)的探索過程;比如,我們可以先總結出滿足大于零的規律,然后是小于零的規律,然后是等于零的規律,這些都是特殊(或者你可以理解成具體);從這些特殊規律總結出一般性(通用性)的規律;

?

E.還有當研究出了算法之后,要學會如何去驗證自己的一般性規律,在我們的code,就是要學會寫測試用例,進行驗證;

?

好了,廢話不多了;直接從代碼開始;開始之前,想嘗試做下面的practice;

?

1.選擇數組的第一個data(target)將數組分成兩部分;滿足:? ?minArr<target<=maxArr;

?

2.選擇數組的第一個data(target)將數組分成兩部分;滿足:? ?minArr<target<=maxArr; 并將target 放入數組“中間位置“;滿足:? target greater than left data and less than right data;

?

3.找出value 在有序數組中的位置;

?

4.找出value 在無序數組中的位置;這個位置應該滿足,它在有序數組中應該具有的位置;greater than left data and less than right data;

?

5.在不開辟內存的情況下(使用新的數組來存儲值)完成問題2;

?

6.關于遞歸的學習和使用(具體看這篇文章的后半部分:http://www.cnblogs.com/mc67/p/5114008.html)

?

7.三種方式來實現我們的額快速排序;(本質的區別只有兩種)

?

8.通過Unit Test 來驗證我們的代碼;

?

?

關于前面的 5個問題,我就直接上代碼;你細細品味(建議在沒有看代碼前,完成上面的問題)

?

 /// <summary>/// 最基本的;將數組分成兩部分;一部分比target小,一部分比target大;/// </summary>/// <param name="arr"></param>static void SplitArray(int[] arr){int len = arr.Length;int target = arr[0];List<int> min = new List<int>(len); //為了方便,這里我使用ListList<int> max = new List<int>(len); //為了方便,這里我使用Listfor (int i = 1; i < len; i++) //從第二個元素開始查找;
            {if (arr[i] < target){min.Add(arr[i]);}else{max.Add(arr[i]);  // as euqual condition,I put it into max;
                }}}/// <summary>/// split the arr and put the target in the right position(greater than left ,less than right)/// </summary>/// <param name="arr"></param>static void SplitArray1(int[] arr){int len = arr.Length;int target = arr[0];List<int> min = new List<int>(len); //為了方便,這里我使用ListList<int> max = new List<int>(len); //為了方便,這里我使用Listfor (int i = 1; i < len; i++) //從第二個元素開始查找;
            {if (arr[i] < target){min.Add(arr[i]);}}//put it in the last of min, that can make sure target greater than min(left)
            min.Add(target);for (int i = 1; i < len; i++) //從第二個元素開始查找;
            {if (arr[i] > target){max.Add(arr[i]);}}min.AddRange(max); //that can make sure  min<target<max
        }/// <summary>/// optimze the SplitArray1/// 上面的代碼,還是有問題的,如果有重復的值,那么,將在判斷max的時候丟掉;/// 那么問題來了,如果相等的如何判斷呢;/// </summary>/// <param name="arr"></param>static void SplitArray2(int[] arr){int len = arr.Length;int target = arr[0];List<int> min = new List<int>(len); //為了方便,這里我使用ListList<int> max = new List<int>(len); //為了方便,這里我使用Listfor (int i = 1; i < len; i++) //從第二個元素開始查找;
            {if (arr[i] < target){min.Add(arr[i]);}}//put it in the last of min, that can make sure target greater than min(left)
            min.Add(target);for (int i = 1; i < len; i++) //從第二個元素開始查找;
            {if (arr[i] >= target) //我們把等于符號加上,就解決問了???? 對于本例子,是從arr[0] 開始的;//那如果是從別的位置開始呢;
                {max.Add(arr[i]);}}}/// <summary>/// start from random index;/// </summary>/// <param name="arr"></param>static void SplitArray3(int[] arr){int len = arr.Length;int randomIndex = 2;int target = arr[randomIndex]; //假設,我們從index=2 開始,這里,我們肯定滿足arr.length>=2;
List<int> min = new List<int>(len); //為了方便,這里我使用ListList<int> max = new List<int>(len); //為了方便,這里我使用Listfor (int i = 0; i < len; i++) //這里,我們就要從0 開始了,遍歷整個數組;
            {if (arr[i] < target){min.Add(arr[i]);}}min.Add(target);for (int i = 0; i < len; i++) //這里,我們就要從0 開始了,遍歷整個數組;
            {if (arr[i] >= target && i != randomIndex) //加上這個條件,我們就可以過濾到我們的 randomIndex 避免重復添加的問題; 
                {max.Add(arr[i]);}}//最后,我們的數組,就是符合我們要求的數組;
        }//上面的做法;可以滿足  min<target<=max/// <summary>/// 我們來找出元素所在的位置 index 首先是我們的有序數組中/// 通過值相等來進行判斷的話,可以滿足;/// 不管值有序 還是 無序的值;/// </summary>static void FindIndex(int[] arr, int value){int len = arr.Length;int index = -1;for (int i = 0; i < len; i++){if (arr[i] == value){index = i;break;}}}/// <summary>/// 兩種思維方式,/// 兩種思維方式;第二種,更接近普通人的表達方式;/// </summary>/// <param name="arr"></param>/// <param name="value"></param>static void FindIndex1(int[] arr, int value){int len = arr.Length;int index;bool isExist = false;for (int i = 0; i < len; i++){if (arr[i] == value){index = i;isExist = true;break;}}if (isExist == false) { index = 1; }}/// <summary>/// 上面的方法是找到,value,在數組中的第一個index 值; 不管它是否有序;/// 現在我們要找一個元素,在有序列表中的(應該插入的值,但是我們不插入)/// </summary>static void FindIndex2(int[] arr, int value){int len = arr.Length;int index = -1;for (int i = 0; i < len; i++){//你可以這么想;//如果找到大于大的數就停止;否則就繼續if (arr[i] >= value)  //考慮到取等情況;
                {index = i; //這個時候,我們的數據,就可以插入在改元素的的后面;index = index - 1;  //這樣就返回了可以直接插入的位置;//并且停止我們的循環;break;    //前提是有序的數組列表中
                }}//在插入的時候,就必須把后面的元素往后面挪動;//插入的時候,
        }/// <summary>/// 上面的方法是找到,value,在數組中的第一個index 值; 不管它是否有序;/// 現在我們要找一個元素,在有序列表中的(應該插入的值,但是我們不插入)///  2 和 3 兩種不同的想法,寫出來的code 就不太一樣;/// </summary>static void FindIndex3(int[] arr, int value){int len = arr.Length;int index = -1;for (int i = 0; i < len; i++){//我們可以可以這么想; if (arr[i] <= value){index++;  //小于它的值,我們的index 就 keep move forward;  還沒考慮,我們取等的情況滴呀;
                }else{//遇到,不滿足的情況,我們就退出//原本的我們的index 是落后于我們的i,出去的時候;再加一次,index++;break;}}//這樣就找到了我們的index;在一個可以插入的位置;
        }/// <summary>/// 先這樣來想,找出小于 value的count,那么value在的位置應該就是在我們的count+1;/// </summary>/// <param name="arr"></param>/// <param name="value"></param>static void FindCountLessThan(int[] arr, int value){int len = arr.Length;int count = 0;for (int i = 0; i < len; i++){if (arr[i] <= value){count++;}}//這樣,我們就能夠找出小于count的數量;那么 我們value所在的位置就是我們count+1
        }/// <summary>/// 關鍵的來了:找到value 應該在的位置;在一個無序的數組中;/// </summary>/// <param name="arr"></param>/// <param name="value"></param>static void FindIndexInUnSortArr(int[] arr, int value){int len = arr.Length;int rightPosition = 0;  //初始化,默認我們的指針在0位置;for (int i = 0; i < len; i++){//通過遍歷來查找;if (arr[i] <= value){rightPosition++;}}}/// <summary>/// 找到index在的位置,并將小于value的數據放在左邊,大于value的數據放在右邊/// </summary>/// <param name="arr"></param>/// <param name="value"></param>static void FindeAndSwap(int[] arr){int len = arr.Length;int middleIndex = 1;int value = arr[0];//target;// i 能找到一個小于value的值;//middleIndex 始終指向一個大于或等于 value的值;for (int i = 1; i < len; i++){if (arr[i] <= value) //當找到一個小于value的值之后,進行交換,和那個值進行交換呢;(原則:小的值移動到左邊,大的值移動到右邊;){                    //現在,我們找到了小的值,那么大的值呢;????if (i == middleIndex){//不進行交換; keep move
                    }else{Swap(arr, middleIndex, i);}middleIndex++;}}//最后出來后,我們要將第一個元素和中間的元素進行交換,也就是講value放在middle的位置;Swap(arr, 0, middleIndex - 1);}/// <summary>///  上面的代碼,基本上已經滿足了我們額基本要求;///  完美的代碼,解決了這個問題;/// </summary>/// <param name="arr"></param>static int FindeAndSwap1(int[] arr, int start, int end){int middlePosition = start + 1;int pivot = arr[start];for (int i = start + 1; i <= end; i++){if (arr[i] <= pivot){if (i == middlePosition){//there is need to swap 
                    }else{Swap(arr, middlePosition, i);}middlePosition++;}}//put the arr[start] in "middle position"(greater than left,less than right)int position = middlePosition - 1;Swap(arr, arr[start], position);return position;}/// <summary>/// 同樣,我們又第二種方式來實現,/// </summary>/// <param name="arr"></param>/// <param name="low"></param>/// <param name="high"></param>static void FindeAndSwap2(int[] arr, int low,int high){int l = low-1;  //make sure pointer move firstly (before take value from arr to compare with pviot)int h = high+1; //make sure pointer move firstly (before take value from arr to compare with pviot)int pviot = arr[low]; while (l<h){while (arr[--h]> pviot) //find some value less than pvoit
                {}while (arr[++l] <= pviot) //find some value greater than pvoit   we use <= instead of <;beacause we don't let arr[start] swap 
                {}if (l < h){Swap(arr, h, l);  //swap
                }}            Swap(arr, low, h);    //put the povit in the "middle" Position
}/// <summary>/// 同樣,我們也有第三種寫法;/// </summary>/// <param name="arr"></param>/// <param name="low"></param>/// <param name="high"></param>static int FindeAndSwap3(int[] arr, int low, int high){int l = low;int h = high;int pviot = arr[low];while (l < h){while (arr[h] >= pviot) //chose >= instead of >; beca if the first value arr[h] equal  pviot ,this will enter endless loop;(don't enter {} do h--;)
                {h--;}while (arr[l] <= pviot)  //we chose <= instead of < to make sure pviot don't take part in swap, we will swap in the last step with "middle" position
                {l++;}if (l >= h)break;Swap(arr,l,h);}int middlePosition = h;Swap(arr,low, middlePosition);return middlePosition;}/// <summary>/// 當然,就有了,我們的第四種方法;/// 你會發現,前面的方法都是,先找到一個小于的index  high 然后找到一個大于的index low/// 然后進行交換;/// 然后有沒有其他的方式呢? /// 答案是有的;/// 而且,你會發現,我們的額pvoit 是沒有參與swap的,直到我們的最后一步,然后將起放在 middle position(這一步,是不可避免滴呀)/// </summary>/// <param name="arr"></param>/// <param name="low"></param>/// <param name="high"></param>/// <returns></returns>static int FindeAndSwap4(int[] arr, int low, int high){int pviot = arr[low];while (low < high){while(arr[high]>=pviot && low < high){high--;}//一旦,找到了,我們就替換;arr[low] = arr[high];  //這樣,會覆蓋我們的第一個值,不過,在最后,我們會將第一個值,放在“中間”位置;while (arr[low] <= pviot && low < high){low++;} //這樣做的話,在沒有,進行到最后一步,數組中會有一個重復的值,不過,我們最后將被我們pviotarr[high] = arr[low];}arr[low] = pviot;return high;}//到了這一步,我們的基本核心的單元,算是基本基本完整了;//然后,我們這里,再實現,三個版本的快速排序;方法;/// <summary>/// 交換/// </summary>/// <param name="arr"></param>/// <param name="i"></param>/// <param name="j"></param>static void Swap(int[] arr, int i, int j){int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}

?

?1.然后是快速排序的第一種實現方式:(從兩端申明指針然后,開始查找; 這個算法是有問題的:to do.....做單元測試來一步一步的發現問題)

        /// <summary>/// 第一種實現方式,從兩邊開始查找;/// 還有一個值得考慮問題就是,等于的數據,如何處理呢;從我們的代碼看出,等于pviot的數據,沒有參與到交換中;/// 第一次交換之后將流在我們的 兩端;參與下一次的交換;/// </summary>/// <param name="arr"></param>/// <param name="low"></param>/// <param name="high"></param>/// <returns></returns>static int QuickSortUnit(int[] arr, int low, int high){
int pviot=arr[low]; //we chose the first value as pivot;
while (low < high){while (arr[high] >= pviot && low<high) //>= instead of > because: if the arr[high] less than pviot,that will result in endless loop(high index never do high--;) {high--; //start search from high address }while (arr[low] <= pviot && low<high) // <= instead of < becuase:we can make sure arr[first] did't involve the whole swap until the ending {low++; //start search from low address }//we both chose equal,after first loop,the equivalent will remianing the origial positon and take part in next sort; that does't affect the final result;if (low >= high)break;Swap(arr, low, high);}//because we firstly star from high; so the last value that must less than pviot;so high is our "middle" position;int middlePosition = high; //make the code easy to read; Swap(arr,middlePosition,low);return high;}/// <summary>/// recurion to resolve the same problem;/// </summary>/// <param name="arr"></param>/// <param name="low"></param>/// <param name="high"></param>static void QuickSort(int [] arr,int low,int high){if (low >= high) //make sure recusion can stopreturn;int middlePositon=QuickSortUnit(arr,low,high);//star from left;QuickSort(arr,low, middlePositon-1);//star from rightQuickSort(arr, middlePositon+1,high);}

2.然后是快速排序的第二種實現方式(本質上和第一種方式一樣的,只不過寫法(想法),略有不同,一旦找到元素就開始覆蓋指定位置的值,這樣每次都會有一個重復的值,不過這個重復的值,最后會被我們的pivot給占據)

        /// <summary>/// /// </summary>/// <param name="arr"></param>/// <param name="low"></param>/// <param name="high"></param>static int QuickSortUnit(int[] arr, int low, int high){int pviot = arr[low];while (low < high){while (arr[high] >= pviot && low<high){high--;}arr[low] = arr[high]; //once find the value less than pviot ,put it in low address;while (arr[low] <= pviot && low < high){low++;}arr[high] = arr[low]; //once find the value greater than pviot, put it in high address;
            }int middlePositon = high;arr[low] = pviot; return middlePositon;}/// <summary>/// use recursion to resovle the same problem;/// </summary>/// <param name="arr"></param>/// <param name="low"></param>/// <param name="high"></param>static void QuickSort(int [] arr,int low,int high){if (low >= high)return;int middlePosition = QuickSortUnit(arr,low,high);QuickSortUnit(arr, low, middlePosition-1);QuickSortUnit(arr, middlePosition+1, high);}

思考:

? ?最后一步交互為哈一定要取low呢;(debug 一下這個:? ? var arr = new[] { 7, 8, 7 };)

?

?

第三種方式;其實,本質是一樣,不過,這種方式,不用從兩端申明pointer,去查找(伴隨著兩個while循環);這里我們用一個循環,還是兩個pointer,不過他們的出發位置,就有所不同了,都從左邊開始;

?提現了不同的思路去解決問題;

?

?

?最后一種,我們就直接給鏈接吧;

?https://www.hackerearth.com/zh/practice/algorithms/sorting/quick-sort/tutorial/

非常好的網站;

?

這里,我們再來總結一下,整個執行過程:

1)設置兩個變量i、j,排序開始的時候:i=0,j=N-1;
2)以第一個數組元素作為關鍵數據,賦值給key,即key=A[0];
3)從j開始向前搜索,即由后開始向前搜索(j--),找到第一個小于key的值A[j],將A[j]和A[i]互換;
4)從i開始向后搜索,即由前開始向后搜索(i++),找到第一個大于key的A[i],將A[i]和A[j]互換;
5)重復第3、4步,直到i=j; (3,4步中,沒找到符合條件的值,即3中A[j]不小于key,4中A[i]不大于key的時候改變j、i的值,使得j=j-1,i=i+1,直至找到為止。找到符合條件的值,進行交換的時候i, j指針位置不變。另外,i==j這一過程一定正好是i+或j-

最后,就是要通過寫單元測試,來assert我們的值;

?

轉載于:https://www.cnblogs.com/mc67/p/8259734.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252542.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252542.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252542.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LINQ to SQL 實現 GROUP BY、聚合、ORDER BY

前言 本示例主要實現 LINQ 查詢&#xff0c;先分組&#xff0c;再聚合&#xff0c;最后在排序。示例很簡單&#xff0c;但是使用 LINQ 卻生成了不同的 SQL 實現。 1) 采用手動編寫 SQL 實現 SELECT ROW_NUMBER() OVER(ORDER BY T.RealTotal DESC) AS SN, * FROM ( SELECT (S…

Mysql之事務

什么是事務 假如你下了一筆訂單&#xff0c;會有以下數據庫操作&#xff1a; 1. 生成一筆訂單記錄 2. 減少庫存 3. 從你的賬戶中減少金額 4. 生成支付記錄 這邊的四個操作缺一不可&#xff0c;一旦某一個操作出現異常&#xff0c;則全部操作都需要全部回滾。而事務的作…

JVM垃圾回收機制總結

對于垃圾回收機制我先拋出三個問題&#xff1a; ①哪些內存需要回收&#xff1f; ②什么時候回收&#xff1f; ③如何回收&#xff1f; 下面我們主要針對這三個問題來研究JVM GC 一、哪些內存需要回收&#xff1f; 1.JAVA使用可達性分析法來判斷對象是否需要回收。 這個算法的基…

虛擬機增加內存方法

樓主由于要在虛擬機里面裝一個oracle&#xff0c;在安裝過程中&#xff0c;提示物理內存不符合最低標準&#xff0c;如圖1. 圖1 因為懶得新建一個虛擬機了&#xff0c;所以考慮給虛擬機新增磁盤空間。 首先說明&#xff0c;新增磁盤空間&#xff0c;必須保證當前虛擬機里每個新…

myBatis xml if、where、if-else?、foreach 心得

MyBatis 的強大特性之一便是它的動態 SQL。如果你有使用 JDBC 或其它類似框架的經驗&#xff0c;你就能體會到根據不同條件拼接 SQL 語句的痛苦。例如拼接時要確保不能忘記添加必要的空格&#xff0c;還要注意去掉列表最后一個列名的逗號。利用動態 SQL 這一特性可以徹底擺脫這…

bzoj千題計劃213:bzoj2660: [Beijing wc2012]最多的方案

http://www.lydsy.com/JudgeOnline/problem.php?id2660 很容易想到是先把n表示成最大的兩個斐波那契數相加&#xff0c;然后再拆分這兩個斐波那契數 把數表示成斐波那契進制的形式&#xff0c;第i位表示有沒有第i個斐波那契數 比如16133 001001 那么拆分一個數就是把一個1…

面對對象-封裝

private 私有的 package/friendly/default 不寫 protected 受保護的 public 公共的 那么什么情況該用什么修飾符呢&#xff1f;從作用域來看&#xff0c;public能夠適用所有的情況。 但是大家在工作的時候&#xff0c;又不會真正全部都適用public,那么到底什么情況改用什么修飾…

本文詳解5G是個什么鬼,程序員都準備好了嗎?

無線移動通訊發展歷史 最近5G的概念炒的如火如荼&#xff0c;為此&#xff0c;華為和高通還干了一仗。這篇文章從技術層面給大家分析&#xff0c;什么是5G&#xff0c;它和4G比&#xff0c;高級在哪里&#xff1f; 我們來看看移動互聯網的技術發展&#xff1a; 然后我們在來看看…

安裝kerberos報錯 error: command 'gcc' failed with exit status 1

pip install kerberos 報錯&#xff1a;error: command gcc failed with exit status 1 安裝環境工具 yum install gcc libffi-devel python-devel openssl-devel 再次安裝kerberos安裝成功 轉載于:https://www.cnblogs.com/panbc/p/8268574.html

jquery正則表達式驗證:驗證全是數字

需求說明&#xff1a; 前端頁面使用正則表達式驗證輸入框中輸入的內容全是數字。 代碼說明&#xff1a; 這里只介紹正則表達式&#xff0c;其他部分的代碼不做介紹。如果有其他需要自行修改即可。 步驟一&#xff1a;建立一個頁面可以是html、jsp等&#xff0c;引入jquery-3.2.…

0613課堂匯總

一&#xff1a; 數據類型&#xff1a; 基本數據類型{byte(8)/short(16)/char(16)/int(32)/float(32)/long(64)/double(64)/boolean(1)}引用數據類型{*除了基本數據類型都是引用數據類型 *包括API中的類&#xff08;String,File&#xff09;*自定義的類&#xff08;Personal A…

Istio流量管理實踐之(5): 使用cert-manager部署Istio自定義入口網關及進行證書管理...

Istio Gateway提供多個自定義入口網關的支持能力&#xff0c;通過開放一系列端口用于承載網格邊緣的進入連接&#xff0c;同時可以使用不同loadbalancer來隔離不同的入口流量。cert-manager可用于使用存儲在Kubernetes Secret資源中的任意簽名密鑰對來獲取證書。本文提供了手動…

log4配置

log4j 和 log4j2 方式一&#xff1a;log4j2.xml 添加 jar 包 1 <!-- log4j-core --> 2 <!-- 3 <dependency> 4 <groupId>org.apache.logging.log4j</groupId> 5 <artifactId>log4j-core</artifactId> 6 …

[bzoj3625][Codeforces 250 E]The Child and Binary Tree(生成函數+多項式運算+FFT)

3625: [Codeforces Round #250]小朋友和二叉樹 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 650 Solved: 283[Submit][Status][Discuss]Description 我們的小朋友很喜歡計算機科學&#xff0c;而且尤其喜歡二叉樹。考慮一個含有n個互異正整數的序列c[1],c[2],...,c[n]。…

常用內建模塊

一.datetime 1.模塊導入: from datetime import datetime 2.獲取當前日期和時間: >>> now datetime.now() >>> print(now) 2019-01-13 14:19:38.1810003.獲取指定日期和時間: >>> dt datetime(2019,1,10,15,0) >>> print(dt) 2019-01-10…

子序列進階問題

題目&#xff1a; 有一個數組&#xff0c;讓找到兩個不重復的連續子序列A,B &#xff0c;求Max(Sum(A)-Sum(B) 分析&#xff1a; AB必定連續&#xff0c;設兩端連接處index為{X&#xff0c;x1}&#xff0c;X可取0~n-1 設F(x)為連接處index為{X&#xff0c;x1}時 Max(Sum(A)…

day5-shelve模塊

一、概述前面章節我們講述了json和pickle模塊的序列化和反序列化處理&#xff0c;他們有一個不足是在python 3中不能多次dump和load&#xff0c;shelve模塊則可以規避這個問題。shelve模塊是一個簡單的k,v將內存數據通過文件持久化的模塊&#xff0c;可以持久化任何pickle可支持…

程序員:請你不要對業務「置之不理」

成長是條孤獨的路&#xff0c;一個人會走得更快&#xff1b;有志同道合者同行&#xff0c;會走得更遠。本篇內容整理自 21 天鯤鵬新青年計劃線上分享內容。鯤鵬新青年計劃是由 TGO 鯤鵬會組織的線上分享活動&#xff0c;希望能幫助更多同學一起學習、成長。12 月 28 日&#xf…

在Ubuntu系統下如何將chrome瀏覽器的bookmarks導出到本地

1. 打開chrome瀏覽器在頁面的右上角點擊那個三個小點的位置&#xff0c;找到bookmarks&#xff0c;然后點擊bookmarks manager,然后在organize右側大倒三角下選擇&#xff0c;export bookmarks to HTML&#xff0c;選擇要保存的位置&#xff0c;利用同樣的方法下次就可以直接導…

php基于數組的分頁實現

關于數組的分頁函數,用數組進行分頁的好處是可以方便的進行聯合多表查詢,只需要將查詢的結果放在數組中就可以了以下是數組分頁的函數,函數page_array用于數組的分頁&#xff0c;函數show_array用于分頁函數的操作及顯示&#xff0c;需要配合使用.兩個函數通過全局變量$countpa…