大白話排序和查找

排序

默認採用降序排列

1.冒泡排序

每次把最小的元素像泡泡一樣,放到數組末尾。

基本原理:外層循環次數有字符串長度-1決定。內層循環,後一個如果比自己小,就交換位置,第一輪就把最小的放到了最後一個元素位置上。那麼下一次循環只需要把第二小的放到倒數第二個位置上,所以內層循環次數隨外層循環變量一樣變化。

優化原理:在內層設置一個檢測是否發生數據交換的標緻變量,如果某一次循環沒有元素交換髮生,那麼說明剩餘數據已經有序。則直接跳出循環。

void bubble_sort(T arr[], int len)
{
    int i, j;  T temp;
    for (i = 0; i < len - 1; i++)
        for (j = 0; j < len - 1 - i; j++)
        if (arr[j] > arr[j + 1])
        {
            temp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = temp;
        }
}
--------------------- 
作者:關耳_12X 
來源:CSDN 
原文:https://blog.csdn.net/sunshine_12x/article/details/80987227 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

end

2.選擇排序

循環更新最小值的下標,並記錄下來。最後將這個最小值和第一個元素交換。下一次從第二個元素開始循環,選出的自然是次小值。

基本原理:外層循環決定了選出的是第i小的值,min記錄下最小值的小標,每層循環結束後,將第i個元素和第min個元素交換位置。

public static void sort(int[] a){
    int N=a.length;
    for(int i=0;i<N;i++){
        int min=i;
        for(int j=i+1;j<N;j++){
            if(a[j]<a[min]){  
                min=j;
            }
        }
        int temp=a[i];
        a[i]=a[min];
        a[min]=temp;
    }
}
--------------------- 
作者:cuit_cuit_cuit 
來源:CSDN 
原文:https://blog.csdn.net/cuit_cuit_cuit/article/details/80552641 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

end

3.插入排序

從第二個元素開始循環,現將第二個元素保存在V中,1-2中循環,如果第一個元素比第二個元素大,就把第一個元素賦值給第二個元素,退出第二層循環後,在把v賦值給最後移動的那個元素。

原理:從第1個元素開始,只要比外層循環的值大的數都往後移一位,並記下break的J,將值插入到A[j]

5 4 3 2 1
for1: i= 1;j=i=1;v = a[1]
for2:a[j-1] > v ; a[j] = a[j-1];//5 5 3 2 1  
      j-- =0//break;
     a[j] = v;//4 5 3 2 1 //j =1

for1: i= 2;j=i=2;v = a[2]
for2:a[j-1] > v ; a[j] = a[j-1];//4 5 5 2 1 
       j--;//j=1
     a[j-1] > v ; a[j] = a[j-1];//4 4 5 2 1 
       j--;//j=0
     a[j] = v;//3 4 5 2 1 

 

void Insertion_Sort(int a[],int n)
{
    int i,j;
    for(i=1;i<n;i++)
    {
        int temp=a[i];
        for(j=i;j>0&&a[j-1]>temp;--j)
            a[j]=a[j-1];
        a[j]=temp;
    }
}
--------------------- 
作者:L_Aster 
來源:CSDN 
原文:https://blog.csdn.net/gl486546/article/details/53052933 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

end

4.希爾排序

5.快速排序

原理:分區交換排序,分而治之。選擇數組最左邊的元素將數組分成兩個部分,一部分大於樞軸,一部小於樞軸,再對這個兩個數組遞歸調用算法。

template<class T>
void Print(T* arr, size_t n)
{
	for (int i = 0; i < n; i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
}
template<class T>
int PartSort(T* arr, int left, int right)
{
	int key = arr[right];
	while (left < right)
	{
		while (left < right && arr[left] <= key)
		{
			++left;
		}
		swap(arr[left], arr[right]);
		while (left < right && arr[right] > key)
		{
			--right;
		}
		if (arr[left] != arr[right])
		{
			swap(arr[left], arr[right]);
		}
	}
	//arr[left] = key;
	return left;
}
 
void QuickSort(int* arr, int left, int right)
{
	assert(arr);
	if (left < right)
	{
		int div = PartSort(arr, left, right);
		QuickSort(arr, left, div - 1);
		QuickSort(arr, div + 1, right);
	}
}

--------------------- 
作者:double_happiness 
來源:CSDN 
原文:https://blog.csdn.net/double_happiness/article/details/72303309 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

這個寫法,實質每次都是左右兩邊分別和key交換。最後key在中間位置。

6.歸併排序

分而治之p

7.樹排序
將數據一個一個的添加到樹種,使用第一個元素作爲根節點,如果之後的元素比第一個小,則放到左子樹,否則放到右子樹,之後按中序遍歷。就會按照升序輸出啦。

8.計數排序

前提條件,輸入的數據在一個範圍內。

根據數據粒度,建立一個數組或者<key,value>.每個key的value決定最後排序此key的個數。

9.桶排序

桶排序跟基數排序相當。桶排序假設待排序的一組數均勻獨立的分佈在一個範圍中,並將這一範圍劃分成幾個子範圍(桶)。

然後基於某種映射函數f ,將待排序列的關鍵字 k 映射到第i個桶中 ,那麼該關鍵字k 就作爲 B[i]中的元素 (每個桶B[i]都是一組大小爲N/M 的序列 )。

接着將各個桶中的數據有序的合併起來 : 對每個桶B[i] 中的所有元素進行比較排序 (可以使用快排)。然後依次枚舉輸出 B[0]….B[M] 中的全部內容即是一個有序序列。

10.基數排序

略;

查找

二分查找

https://blog.csdn.net/qq78442761/article/details/73012452

散列

 https://blog.csdn.net/duan19920101/article/details/51579136  拉鍊法 

負載因子討論

https://bbs.csdn.net/topics/350237871

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章