十大排序算法函數聲明
時間複雜度表
主函數
#include<iostream>
using namespace std;
void BubbleSort(int length, int array[]);
void SelectSort(int length, int array[]);
void InsertSort(int length, int array[]);
void ShellSort(int length, int array[]);
void MergeSort(int length, int array[]);
void QuickSort( int begin,int end,int array[]);
void Swap(int i, int j, int array[]);
int Partition(int begin, int end, int array[]);
void CountSort(int length, int array[]);
void BucketSort(int length, int array[]);
void RadixSort(int length, int array[]);
int main() {
int array[6] = { 2,9,1,5,3,6 };
cout << "排序前";
for (int i = 0; i < 6; i++)
{
cout << array[i]<<",";
}
cout << endl;
QuickSort(0, 5, array);
cout << "排序後";
for (int i = 0; i < 6; i++)
{
cout << array[i] << ",";
}
system("pause");
return 0;
}
1冒泡排序(加入flag標記簡單優化)
void BubbleSort(int length, int array[])
{
for (int i = 0; i < length; i++)
{
bool flag = true;
for (int j = 0; j < length-i-1; j++)
{
if (array[j] > array[j + 1])
{
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
flag = false;
}
}
if (flag)
return;
}
}
2插入排序
void InsertSort(int length, int array[])
{
int current;
for (int i = 0; i < length-1; i++)
{
current = array[i + 1];
int preindex = i;
while (preindex>=0 && array[preindex]> current)
{
array[preindex + 1] = array[preindex];
preindex--;
}
array[preindex+1] = current;
}
}
3希爾排序(優化插排)
void ShellSort(int length,int array[])
{
int temp, gap = length / 2;
while (gap>0)
{
for (int i = gap; i < length; i++)
{
temp = array[i];
int preIndex = i - gap;
while (preIndex>=0&& array[preIndex]>temp)
{
array[preIndex + gap] = array[preIndex];
preIndex -= gap;
}
array[preIndex + gap] = temp;
}
gap /= 2;
}
}
4選擇排序(選擇最小元素下標)
void SelectSort(int length,int array[]) {
for (int i = 0; i < length-1; i++) {
int minindex =i;
for (int j = minindex; j < length - 1; j++) {
if (array[minindex] > array[j + 1]) {
minindex = j + 1;
}
}
int temp = array[i];
array[i] = array[minindex];
array[minindex] = temp;
}
}
5歸併排序(優化選擇排序)
void Mergesort( int L, int R,int array[])
{
if (L < R)
{
int mid = L + ((R - L) >> 1);
Mergesort( L, mid,array);
Mergesort( mid + 1, R,array);
Merge( L, mid, R,array);
}
}
void Merge( int L, int mid, int R,int array[])
{
int *temp= new int[R - L + 1];
int i = 0;
int p1 = L;
int p2 = mid + 1;
while(p1 <= mid && p2 <= R) {
temp[i++] = array[p1] < array[p2] ? array[p1++] : array[p2++];
}
while(p1 <= mid) {
temp[i++] = array[p1++];
}
while(p2 <= R) {
temp[i++] = array[p2++];
}
for (i = 0; i < R - L +1; i++) {
array[L + i] = temp[i];
}
delete[]temp;
}
6.1快速排序(單向掃描)
void Swap(int i, int j, int array[])
{
int temp;
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
void QuickSort(int begin, int end, int array[])
{
if (begin<end)
{
int mid = Partition(begin, end, array);
QuickSort(begin, mid-1, array);
QuickSort(mid + 1,end, array);
}
}
int Partition(int begin, int end, int array[])
{
int pivot = array[begin];
int sp = begin + 1;
int bigger = end;
while (sp<=bigger)
{
if (array[sp] > pivot)
{
Swap(sp,bigger,array);
bigger--;
}
else
{
sp++;
}
}
Swap(begin, bigger, array);
return bigger;
}
6.2快速排序(雙向掃描法)
int DoubblePartition(int begin,int end,int array[])
{
int pivot = array[begin];
int left = begin + 1;
int right = end;
while (left<=right)
{
if (array[left]<=pivot && left <= right)
{
left++;
}
if (array[right] > pivot&&left <= right)
{
right--;
}
else if(left<right)
{
Swap(left, right,array);
}
}
Swap(begin, right, array);
return right;
}
void DoubbleQuickSort(int begin, int end, int array[])
{
if (begin < end)
{
int mid = DoubblePartition(begin, end, array);
DoubbleQuickSort(begin, mid - 1, array);
DoubbleQuickSort(mid + 1, end, array);
}
}
7堆排序
8計數排序
9桶排序
10基數排序