91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

查找與排序

發布時間:2020-06-15 23:25:14 來源:網絡 閱讀:457 作者:Sekai_Z 欄目:編程語言

 查找和排序都是程序中經常用到的算法

 一、查找

    查找分為:順序查找,二分查找、哈希表查找和二叉樹排序查找。

    哈希表和二叉樹查找的重點在于其數據結構。哈希表的主要優點是能夠在O(1)的時間查找某一元素,是效率最高的查找方式。其缺點是需要額外的空間來實現哈希表。

二、排序

    排序分為插入排序,交換排序,選擇排序歸并排序等。排序的這幾種方法的優劣(額外空間的消耗,平均時間復雜度和最差時間復雜度)、特點是重點。

1.插入排序

a.直接插入

當給定的數據元素序列有序時,關鍵字之間比較次數最少,最好的情況下時間復雜度為O(N),最差的情況下為O(N^2)

void InSertSort(int*a, int length)
{
	for (int i = 1; i < length; i++)
	{
		int tmp = a[i];
		int j = 0;		
		for ( j = i-1; j >=0&&tmp<a[j];j--)//當后面無序的元素小于有序的元素時,將那個有序的元素到要排序的這個元素整體后移后移
		{
			a[j + 1] = a[j];
		}
		a[j+1] = tmp;
	}
}

插入排序是最穩定的排序方法

b.折半插入

和直接插入排序過程相似,用折半的方法尋找插入位置。

void BiInsertSort(int *a, int length)
{
	for (int i = 1; i < length; i++)
	{
		int tmp = a[i];
		int left = 0;
		int right = i - 1;
		int j = 0;

		while (left <= right)
		{
			int mid = (left + right);
			if (tmp < a[mid])//折半
			{
				right = mid - 1;
			}
			else
			{
				left = mid + 1;
			}
		}
		for (j = i - 1; j >= left; j--)//后移
		{
			a[j + 1] = a[j];
		}
		a[j + 1] = tmp;
	}
}


2.交換排序

    兩兩比較,若發現存在逆序,則交換,一直待到元素序列沒有逆序為止

a.冒泡排序

時間復雜度為O (n^2) 是穩定的排序方法

void BubbleSort(int *a, int length)
{
	for (int i = 0; i < length; i++)
	{
		for (int j = 0; j < length - i-1; j++)
		{
			if (a[j]>a[j + 1])
				swap(a[j], a[j + 1]);
		}
	}
}



b.快速排序

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-完成的時候,此時令循環結束)。

int Partition(int *a, int i, int j)
{
	int base = a[i];
	while (i < j)
	{
		//從右往左掃描
		while (base < a[j] && i<j)
			j--;
		if (i<j)//經過上一步while循環,a[i]>a[j]
		{
			swap(a[i], a[j]);
			i++;
		}
		//從左往右掃描
		while (i<j && base>a[i])
			i++;
		if (i<j)
		{
			swap(a[i], a[j]);
			j--;
		}
	}
	a[i] = base;
	return i;
}
void QuickSort(int *a, int start, int end)
{
	int index=0;
	if (start < end)
	{
		index = Partition(a, start, end);
		QuickSort(a, start, index - 1);
		QuickSort(a, index + 1, end);
	}
}


3.選擇排序

a.直接選擇排序

b.堆排序

快速排序

    快速排序關鍵在于先在數組中選擇一個數字,接下來吧數組中的數字分為兩部分,比選擇數組小的放到左邊,大的放到右邊。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

海林市| 逊克县| 宕昌县| 永登县| 扎鲁特旗| 玉溪市| 金塔县| 南安市| 木兰县| 鹿邑县| 平昌县| 广水市| 曲阜市| 日喀则市| 白水县| 十堰市| 尉氏县| 新沂市| 张家川| 巴南区| 阜城县| 册亨县| 嵊泗县| 从化市| 太原市| 宝丰县| 大荔县| 宣化县| 绥中县| 浦县| 台北市| 阿尔山市| 陆川县| 小金县| 靖远县| 武安市| 鄂温| 张掖市| 南木林县| 油尖旺区| 拉萨市|