主頁 > 軟體設計 > 【資料結構】最全排序匯總 | 考研重點!

【資料結構】最全排序匯總 | 考研重點!

2021-02-04 13:48:51 軟體設計

本文主要內容

1. 排序及其相關概念的介紹
2. 常見排序及其演算法實作
3. 排序演算法復雜度及穩定性分析


目錄

  • 本文主要內容
  • 一、排序及其相關概念的介紹
  • 二、常見排序及其演算法實作
    • 1.插入排序
        • 1.1直接插入排序
        • 1.2希爾排序(縮小增量排序)
    • 2.選擇排序
        • 2.1直接選擇排序
        • 2.1堆排序
    • 3.交換排序
        • 3.1冒泡排序
        • 3.2快速排序
          • 3.2.1快速排序之左右指標法
          • 3.2.2快速排序之挖坑法
          • 3.2.3快速排序之前后指標法
          • 3.2.4快速排序之非遞回實作
    • 4.歸并排序
        • 4.1歸并排序
        • 4.2歸并排序(非遞回)
  • 三、 排序演算法復雜度及穩定性分析


一、排序及其相關概念的介紹

  • 排序:使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作,
  • 穩定性:假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,則稱這種排序演算法是穩定的;否則稱為不穩定的,(即在一個序列中,相同關鍵字的相對次序在排序前后不發生改變,就稱該排序穩定,反之不穩定,)
  • 內部排序:資料元素全部放在記憶體中的排序,
  • 外部排序:資料元素太多不能同時放在記憶體中,根據排序程序的要求不能在內外存之間移動資料的排序,

二、常見排序及其演算法實作

在這里插入圖片描述

1.插入排序

1.1直接插入排序

基本思想:當插入第i(i>=1)個元素時,前面的a[0],a[1],…,a[i-1]已經排好序,此時用a[i]的排序碼與a[i-1],a[i-2],…的排序碼順序進行比較,找到插入位置即將array[i]插入,原來位置上的元素順序后移,
在這里插入圖片描述

void InsertSort(int* a, int n)
{
	for (int i = 0; i < n - 1; i++)
	{
		//把end+1的資料插入到[0,end]的有序區間
		int end = i;//end為已經排好的序列的最后的位置
		int temp = a[end + 1];//待插入的資料
		while (end >= 0)
		{
			if (temp < a[end])
			{
				a[end + 1] = a[end];
				end--;
			}
			else
			{
				break;
			}
		}
		a[end + 1] = temp;

	}
}

直接插入排序的特性總結:

  1. 元素集合越接近有序,直接插入排序演算法的時間效率越高;反之,越接近逆序,越壞,
  2. 時間復雜度:O(N^2)
  3. 空間復雜度:O(1)
  4. 穩定性:穩定

1.2希爾排序(縮小增量排序)

基本思想:先進行預排序,把間距為gap的值分為一組,對每組進行插入排序,再對gap進行遞減取值,重復上述分組和排序的作業,當gap=1時,所有記錄在統一組內排好序(此時也就是進行直接插入排序)
在這里插入圖片描述

void ShellSort(int* a, int n)
{
	//把gap設定的大一點,然后預排序,讓陣列接近有序
	//最后gap==1,直接插入排序,保證有序
	int gap = n;
	while (gap > 1)
	{
		gap = gap / 3 + 1;//gap一直是遞減的形態;
		//+1 :保證最后一次gap一定是1,才能實作完全排序   
		for (int i = 0; i < n - gap; i++) // i++實作多組并排
		{
			//for回圈內部是單組內部的排序
			int end = i;
			int temp = a[end + gap];
			while (end >= 0)
			{
				if (temp < a[end])
				{
					a[end + gap] = a[end];
					end -= gap;
				}
				else
				{
					break;
				}
			}
			a[end + gap] = temp;
		}
	}
}

希爾排序的特性總結:

  1. 希爾排序是對直接插入排序的優化,
  2. 當gap > 1時都是預排序,目的是讓陣列更接近于有序,當gap = 1時,陣列已經接近有序的了,這樣就會很快,整體而言,可以達到優化的效果,
  3. 希爾排序的時間復雜度不好計算,需要進行推導,推匯出來平均時間復雜度: O(N^1.3— N^2)
  4. 穩定性:不穩定

2.選擇排序

2.1直接選擇排序

基本思想:在元素集合a[i]–a[n-1]中選擇關鍵碼最大(小)的資料元素,若它不是這組元素中的最后一個(第一個)元素,則將它與這組元素中的最后一個(第一個)元素交換,在剩余的a[i]–a[n-2](a[i+1]–a[n-1])集合中,重復上述步驟,直到集合剩余1個元素,排序結束,
在這里插入圖片描述

void SelectSort(int* a, int n)
{
	for(int i=1;i<=n-1;i++)//進行n-1趟選擇
	{
        int index=i;
        for(int j=i+1;j<=n;j++)//從無序中選取最小,并記錄下標
        {
  	    	if(a[index]>a[j])
                index=j;
        }
        if(index!=i)
            swap(a[i],a[index]);
    }

}

直接選擇排序的特性總結:

  1. 直接選擇排序效率不佳,實際中很少使用,
  2. 時間復雜度:O(N^2)
  3. 空間復雜度:O(1)
  4. 穩定性:不穩定

2.1堆排序

基本思想:利用堆積樹(堆)這種資料結構所設計的一種排序演算法,通過堆來進行選擇資料,需要注意的是排升序要建大堆,排降序建小堆
在這里插入圖片描述

void AdjustDown(int* a, int n, int root)
{
	int parent = root;
	int child = parent * 2 + 1;
	while (child < n)
	{
		if (child + 1 < n&&a[child + 1] > a[child])
		{
			child++;
		}
		if (a[child]>a[parent])
		{
			Swap(&a[child], &a[parent]);

			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			break;
		}
	}
}
void HeapSort(int* a, int n)
{
	//排升序,建大堆
	for (int i = (n - 1 - 1) / 2; i >= 0; i--)
	{
		AdjustDown(a, n, i);
	}
	int end = n - 1;
	while (end > 0)
	{
		Swap(&a[end], &a[0]);
		AdjustDown(a, end, 0);
		end--;
	}
}

堆排序的特性總結:

  1. 堆排序使用堆來選數,效率高了很多,
  2. 時間復雜度:O(N*logN)
  3. 空間復雜度:O(1)
  4. 穩定性:不穩定

3.交換排序

3.1冒泡排序

基本思想:對所有相鄰記錄的關鍵字值進行比效,如果是逆序,則將其交換,最終達到有序的程序,
在這里插入圖片描述

void BubbleSort(int* a, int n)
{
	int end = n;
	while (end > 0)
	{
		int exchange = 0;
		for (int i = 1; i < end; i++)
		{
			if (a[i - 1]>a[i])
			{
				Swap(&a[i - 1], &a[i]);
				exchange = 1;
			}
		}
		if (exchange == 0)
		{
			break;
		}
		end--;
	}
}

冒泡排序的特性總結:

  1. 冒泡排序是一種非常容易理解的排序
  2. 時間復雜度:O(N^2)
  3. 空間復雜度:O(1)
  4. 穩定性:穩定

3.2快速排序

基本思想:任取待排序元素序列中的某元素作為基準值,按照該排序碼,將待排序集合分割成兩子序列:左子序列中所有元素均小于基準值,右子序列中所有元素均大于基準值,然后最左右子序列重復該程序,直到所有元素都排列在相應位置上為止,

將區間按斬訓準值劃分為左右兩半部分的常見方式有:
1. 左右指標法(hoare版本)
2. 挖坑法
3. 前后指標法

3.2.1快速排序之左右指標法

基本思想:選串列中的一個元素作為基準值,begin指標在第一位找比 它大的值,end指標在最后一位找比它小的值,最終通過一系列的交換,達到基準值的左側都比它小,右側都比它大,
注意:若基準值key選擇左邊第一位,那么要讓end先走,這樣能保證它們相遇的位置是比key小的位置;若選擇右邊第一位,那么讓begin先走,這樣能保證它們相遇的位置是比key大的位置(begin找到大的停下來,然后end去和它相遇),
在這里插入圖片描述

int QuickSort(int* a, int begin, int end)
{
	int key = a[end];
	int keyindex = end;
	while (begin < end)
	{
		//begin找大
		while (begin < end && a[begin] <= key)
		{
			begin++;
		}
		//end找小
		while (begin < end && a[end] >= key)
		{
			end--;
		}
		Swap(&a[begin], &a[end]);
	}
	Swap(&a[begin], &a[keyindex]);
	
	int div = begin;//相遇的位置
	QuickSort(a, left, div - 1);
	QuickSort(a, div + 1, right);
}
3.2.2快速排序之挖坑法

基本思想:選取序列中第一個元素為坑,保存在key中,坑的意思是,這個位置的值被拿走了,可以覆寫,填新的值,那么end先走,找比key的值小的數,填到坑中,end為新的坑,然后begin再走,找比key大的值填入新坑中,直至begin與end相遇結束該趟回圈,

挖坑法與左右指標很類似,因此,參照上圖即可,

int QuickSort(int* a, int begin, int end)
{
	int key = a[end];//坑 (這個位置的值被拿走了,可以覆寫,填新的值)
	while (begin < end)
	{
		while (begin < end&&a[begin] <= key)
		{
			begin++;
		}
		//左邊找到比key大的填到右邊的坑,然后begin位置就形成了新的坑
		a[end] = a[begin];
		while (begin < end&&a[end] >= key)
		{
			end--;
		}
		//右邊找到比key小的值填到左邊的坑,然后end的位置形成新的坑
		a[begin] = a[end];
	}
	//填一下坑 也就是end和begin相遇的位置
	a[begin] = key;
	
	int div = begin;//相遇的位置
	QuickSort(a, left, div - 1);
	QuickSort(a, div + 1, right);
}
3.2.3快速排序之前后指標法

基本思想:設定兩個指標,分別為prev與cur,prev在cur的前面,選取最后一個元素為基準值,保存至key中, cur找到比key小的值停下,然后prev++,cur和prev位置的值進行交換,

int PartSort3(int* a, int begin, int end)
{
	//cur找到比key小的停下,然后prev++;
	//然后cur和prev位置的值交換
	int prev = begin - 1;
	int cur = begin;
	int keyIndex = end;
	while (cur < end)
	{
		if (a[cur] < a[keyIndex] && ++prev != cur)
		{
			Swap(&a[cur], &a[prev]);
		}
		++cur;
	}
	Swap(&a[++prev], &a[keyIndex]);
	
	int div = prev;
	QuickSort(a, left, div - 1);
	QuickSort(a, div + 1, right);
}

快速排序的特性總結:

  1. 整體的綜合性能和使用場景都比較好
  2. 時間復雜度分析:
    最好的情況:恰巧每次都選到了中位數作為key,那么時間復雜度為O(N*logN)
    最壞的情況:key為陣列中最大或最小的那個數,時間復雜度O(N^2) 有序的情況下,
    *做出“三數取中”改進,所以不會出現最壞的情況,所以時間復雜度不考慮最壞,因此為O(N logN),
  3. 空間復雜度:O(logN)
  4. 穩定性:不穩定

快速排序遞回方式的優化:
(1)三數取中法選key:不要選到最大或最小的那個數

int getMidIndex(int *a, int begin, int end)
{
	int mid = (begin + end) / 2;
	if (a[begin] < a[mid])
	{
		if (a[mid] < a[end])
		{
			return mid;
		}
		else if (a[begin] < a[end])
		{
			return end;
		}
		else return begin;
	}
	else //a[begin] > a[mid]
	{
		if (a[mid]>a[end])
		{
			return mid;
		}
		else if (a[begin] > a[end])
		{
			return end;
		}
		else return begin;
	}
}

(2) 小區間優化:遞回到小的子區間(如10個元素以下)時,可以考慮使用插入排序,可以減少整體的遞回次數,

3.2.4快速排序之非遞回實作

基本思想:將區間劃分成若干個子區間,利用堆疊的性質,來實作每個區間的有序,

void QuickSortNonR(int* a, int left, int right)
{
	//用堆疊來實作
	stack st;
	stackInit(&st);

	stackPush(&st, right);
	stackPush(&st, left);

	while (!stackEmpty(&st))
	{
		int begin = stackTop(&st);
		stackPop(&st);
		int end = stackTop(&st);
		stackPop(&st);

		//取出堆疊中的區間[begin,end],開始分
		int div = QuickSort(a, begin, end);

		//[begin, div-1] div [div+1, end]
		if (div + 1 < end) //說明該區間中至少有兩個值
		{
			stackPush(&st, end);
			stackPush(&st, div + 1);
		}
		if (begin < div - 1)
		{
			stackPush(&st, div - 1);
			stackPush(&st, begin);
		}
	}
	stackDestory(&st);
}

4.歸并排序

4.1歸并排序

基本思想:采用分治法,將已有序的子序列合并,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序,若將兩個有序表合并成一個有序表,稱為二路歸并,
在這里插入圖片描述

void MergeArr(int* a, int begin1, int end1, int begin2, int end2, int* temp)
{
	int left = begin1, right = end2;
	int index = begin1;
	while (begin1 <= end1 && begin2 <= end2)
	{
		if (a[begin1] < a[begin2])
			temp[index++] = a[begin1++];
		else
			temp[index++] = a[begin2++];
	}

	while (begin1 <= end1)
		temp[index++] = a[begin1++];

	while (begin2 <= end2)
		temp[index++] = a[begin2++];

	// 把歸并好的再tmp的資料在拷貝回到原陣列
	for (int i = left; i <= right; ++i)
		a[i] = temp[i];
}
void _MergeSort(int* a, int left, int right, int* temp)
{
	if (left>=right)
	{
		return;
	}
	int mid = (left + right) / 2;
	//[left,mid] [mid+1,right] 有序,則可以合并,現在它們沒有序,子問題解決
	_MergeSort(a, left, mid, temp);
	_MergeSort(a, mid + 1, right, temp);

	//歸并[left,mid][mid+1,right]有序
	MergeArr(a, left, mid, mid + 1, right, temp);
}
// 歸并排序遞回實作
void MergeSort(int* a, int n)
{
	int* temp = (int*)malloc(sizeof(int)*n);
	_MergeSort(a, 0, n - 1, temp);
	free(temp);
}

歸并排序的特性總結

  1. 它思考更多的是,解決在磁盤中的外排序問題,
  2. 時間復雜度:O(N*logN)
  3. 空間復雜度:O(N) (缺點)
  4. 穩定性:穩定

4.2歸并排序(非遞回)

void MergeSortNonR(int* a, int n)
{
	int* temp = (int*)malloc(sizeof(int)*n);
	int gap = 1;//間隔

	while (gap < n)
	{
		for (int i = 0; i < n; i += 2 * gap)
		{
			//[i,i+gap)[i+gap,i+2*gap)
			//[i,i+gap-1][i+gap,i+2*gap-1]
			int begin1 = i, end1 = i + gap - 1;
			int begin2 = i + gap, end2 = i + 2 * gap - 1;

			//會有越界的情況
			//1、合并時只有第一組,第二組不存在,就不需要合并
			if (begin2 >= n)
			{
				break;
			}
			//2、合并時第二組只有部分資料,需要修正end2邊界
			if (end2 >= n)
			{
				end2 = n - 1;
			}
			MergeArr(a, begin1, end1, begin2, end2, temp);
		}
		gap *= 2;
	}

	free(temp);
}

三、 排序演算法復雜度及穩定性分析

在這里插入圖片描述


轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/256410.html

標籤:其他

上一篇:程式員經常去的6大編程刷題網站,面筆試、復習、挑戰必備!建議收藏

下一篇:一文搞懂Linux行程調度原理

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more