各種排序演算法

2021-07-13 01:58:11 字數 3543 閱讀 1828

在c++和資料結構的學習中,我學到了很多種排序方法。

下面我簡單列出這些排序演算法的c++實現方法。

#include#include//直接插入排序

void insertsort(int* a,size_t size)

a[end + 1] = tmp; }}

//列印陣列

void printarray(int* a,size_t size)

cout << endl;

}//希爾排序

//原理類似於插入排序,把陣列分為不同組,每兩個元素之間有一定的間隔,提高了效率

void shellsort(int* a,size_t size)

a[end + gap] = tmp;

} }}//堆排序

void adjustdown(int* a, size_t size, size_t parent)

//已經為有序狀態

else

}}void heapsort(int* a, size_t size)

//調整

for (int i = 0; i < size-i-1; ++i) }

//單趟排序

int partsort1(int* a, int left, int right)

//將大於key的值換到後面,將小於key的值換到前面

if (begin < end)

}//解決只有兩個元素時出現的bug

if (a[begin]>a[right])

else }

//挖坑法

int partsort2(int* a, int left, int right)

//此時將left的值填到剛才挖走的right上

if (left < right)

//找到right的值小於key,停止,否則向前走

while (left < right && a[right] >= key)

//此時將right的值填到剛才挖走的left上

if (left < right)

}a[left] = key;

return left;

}//三數取中間

int getmidindex(int* a, int left, int right)

//a[mid] a[right] a[left]

if (a[right] < a[left])

//a[mid] a[left] a[right]

else

}else

//a[left] a[right] a[mid]

if (a[left] < a[right])

//a[right] a[left] a[mid]

else

}}//優化---解決快排基本有序時效率太低問題

int partsort3(int* a, int left, int right)

++cur;

} //將key放在剛才prev的下乙個位置

swap(a[++prev], a[right]);

return prev;

}//快速排序

void quicksort(int* a, int left, int right)

//陣列中元素個數小於13,用插入排序效率更高

if (left - right < 13)

//快排遞迴

else }

//選擇排序

void selectsort(int* a, int size)

if (a[i]>a[right])

}//區間逐漸向中間收攏,直到left和right相遇

++left;

--right; }}

//非遞迴快速排序

void quicksort_nonr(int* a, int left, int right)

//右半部分

if (mid + 1 < right)

while (!s.empty())

if (mid + 1 < r)

} }}

//合併每兩個排好序的小組元素

void _merge(int* a, int* tmp, int begin, int mid, int end)

else

}//剩餘資料

while (i <= mid)

while (j <= end)

//將tmp中資料複製到a中

for (int i = 0; i < index; i++) }

//遞迴合併

void _mergesort(int* a, int* tmp, int left, int right)

int mid = left + (right - left) / 2;

//每次遞迴進行找陣列的左半部分

_mergesort(a, tmp, left, mid);

//每次遞迴進行找陣列的右半部分

_mergesort(a, tmp, mid + 1, right);

//將得到的左右兩部分進行合併

_merge(a, tmp, left, mid, right);

}//歸併排序

void mergesort(int* a, size_t size)

//計數排序

void countsort(int* a, size_t size)

//找到最大值

if (a[i] > max)

}int range = max - min + 1; //計數範圍

int* count = new int[range];//計數區間

memset(count, 0, sizeof(int)*range);

for (size_t i = 0; i < size; ++i)

size_t index = 0;

for (int i = 0; i < range; ++i) }

}//獲取最大基數

int getmaxradix(int* a, size_t size)

} return radix;

}//基數排序

void lsdsort(int* a, size_t size)

;//計數器

int start[10] = ;//收集器

int* bucket = new int[size];//建立size個桶

int radix = 1;//基數至少為一

for (int i = 1; i <= maxradix; ++i)//進行maxradix次排序

size_t index = 1;

start[0] = 0;

while (index < 10)

for (size_t i = 0; i < size; ++i)

radix *= 10;

memcpy(a, bucket, sizeof(int)*size);//將桶中內容拷貝到a中

} delete bucket;

}

排序 各種排序演算法

每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子表中適當位置,直到全部記錄插入完成為止 待排序的記錄放在陣列r 0,n 1 中 排序過程中將r分成兩個子區間,有序區r 0,i 1 無序區r i,n 1 將當前無序區的第1個記錄,插入到有序區中適當的位置上 每次是有序區增加乙個記錄,知道...

各種排序演算法

交換函式 void swap int a,int b 氣泡排序 氣泡排序 bubble sort,台灣譯為 泡沫排序或氣泡排序 是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排...

各種排序演算法

include include include using namespace std void swap int a,int b void output int a,int n 直接插入排序 時間複雜度o n 2 void insertsort int a,int n 折半插入排序 o n 2 只...