在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 只...