演算法與資料結構

2021-09-12 08:53:54 字數 3624 閱讀 1898

假設排序從小到大,每次從未排序的子串行中找出最小的值,與這個子串行第乙個值交換,i++;

templatevoid selectionsort(t arr, int n)

}

每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子串行中,直到全部記錄插入完成。

插入排序包括:直接插入排序,折半插入排序和希爾排序。

templatevoid insertionsort(t arr, int n)

return;

}

// 將arr[l...mid]和arr[mid+1...r]兩部分進行歸併

templatevoid __merge(t arr, int l, int mid, int r)

else if( j > r )

else if( aux[i-l] < aux[j-l] )

else

}//delete aux;

}// 遞迴使用歸併排序,對arr[l...r]的範圍進行排序

templatevoid __mergesort(t arr, int l, int r)

templatevoid mergesort(t arr, int n)

歸併排序優化

// 使用優化的歸併排序演算法, 對arr[l...r]的範圍進行排序

templatevoid __mergesort2(t arr, int l, int r)

int mid = (l+r)/2;

__mergesort2(arr, l, mid);

__mergesort2(arr, mid+1, r);

// 優化1: 對於arr[mid] <= arr[mid+1]的情況,不進行merge

// 對於近乎有序的陣列非常有效,但是對於一般情況,有一定的效能損失

if( arr[mid] > arr[mid+1] )

__merge(arr, l, mid, r);

}templatevoid mergesort2(t arr, int n)

// 對arr[l...r]部分進行partition操作

// 返回p, 使得arr[l...p-1] < arr[p] ; arr[p+1...r] > arr[p]

template int __partition(t arr, int l, int r)

swap( arr[l] , arr[j]);

return j;

}// 對arr[l...r]部分進行快速排序

template void __quicksort(t arr, int l, int r)

template void quicksort(t arr, int n)

優化1

對近乎有序的陣列

// 對arr[l...r]部分進行partition操作

// 返回p, 使得arr[l...p-1] < arr[p] ; arr[p+1...r] > arr[p]

template int _partition(t arr, int l, int r)

swap( arr[l] , arr[j]);

return j;

}// 對arr[l...r]部分進行快速排序

template void _quicksort(t arr, int l, int r)

int p = _partition(arr, l, r);

_quicksort(arr, l, p-1 );

_quicksort(arr, p+1, r);

}template void quicksort(t arr, int n)

優化2

避免包含大量重複值,雙路快排

// 雙路快速排序的partition

// 返回p, 使得arr[l...p-1] <= arr[p] ; arr[p+1...r] >= arr[p]

// 雙路快排處理的元素正好等於arr[p]的時候要注意,詳見下面的注釋:)

template int _partition2(t arr, int l, int r)

swap( arr[l] , arr[j]);

return j;

}// 對arr[l...r]部分進行快速排序

template void _quicksort(t arr, int l, int r)

// 呼叫雙路快速排序的partition

int p = _partition2(arr, l, r);

_quicksort(arr, l, p-1 );

_quicksort(arr, p+1, r);

}template void quicksort(t arr, int n)

求逆序對(歸併排序)

// 將arr[l...mid]和arr[mid+1...r]兩部分進行歸併

long long __merge(int arr, int l, int mid, int r)

long long res=0;

int i=l, j=mid+1;

for(int k=l;k<=r;k++)

else if(j>r)

else if(aux[i-l]= r )

return 0;

int mid = l + (r-l)/2;

// 求出 arr[l...mid] 範圍的逆序數

long long res1 = __inversioncount( arr, l, mid);

// 求出 arr[mid+1...r] 範圍的逆序數

long long res2 = __inversioncount( arr, mid+1, r);

return res1 + res2 + __merge( arr, l, mid, r);

}// 遞迴求arr的逆序數對個數

long long inversioncount(int arr, int n)

求第k小的數

// 對arr[l...r]部分進行partition操作

// 返回p, 使得arr[l...p-1] < arr[p] ; arr[p+1...r] > arr[p]

template int __partition(t arr, int l, int r)

swap( arr[l] , arr[j]);

return j;

}// 對arr[l...r]部分進行快速排序

template int _quicksort(t arr, int l, int r, int k)else

return arr[p];

}//找第k小

template int quicksort(t arr, int n,int k)

資料結構與演算法 演算法 演算法和資料結構

資料結構與演算法 演算法 好吧,在這裡,您被優秀或優秀的軟體開發人員所隔開。在這種情況下,我會告訴您一開始或至少在我的情況下,並且我知道大多數時候,對於我認識的大多數人,您會覺得自己是乙個無能的人或白痴。基本上,我怎麼可能不理解這一點,然後您會感到沮喪。在這種情況下,我會告訴您情況並不像您想的那麼糟...

資料結構 資料結構與演算法01

1 求一組整數中的最大值。演算法 基本操作是 比較兩個數的大小 模型 仔細想想 你並不知道這個整數到底是多大?整數過大你該怎麼去表示?2 足協的資料庫管理的程式 演算法 需要管理的專案?如何管理?使用者介面?模型 3 資料與資料結構 資料 所有能被輸入到計算機中,並被計算機處理的符號的集合計算機操作...

資料結構 資料結構與演算法02

1 演算法設計的原則 設計演算法時,通常應考慮達到以下目標 1,正確性 2,可讀性 3,健壯性 4,高效率與低儲存量需求 1,正確性 規格說明 四個層次 a,程式中不含語法錯誤 b,程式對於幾組輸入資料能夠得出滿足要求的結果 c,程式對精心選擇的 典型 苛刻切帶有刁難性的幾組輸入資料能夠得出滿足要求...