假設排序從小到大,每次從未排序的子串行中找出最小的值,與這個子串行第乙個值交換,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,程式對精心選擇的 典型 苛刻切帶有刁難性的幾組輸入資料能夠得出滿足要求...