-
Notifications
You must be signed in to change notification settings - Fork 53
排序算法
jiaxw32 edited this page Jun 6, 2020
·
4 revisions
void bubbleSort(int arr[], int len){
if (arr == nullptr || len == 0) {
return;
}
for (int i = 0; i < len - 1; i++) {
for (int j = 0; j < len - 1 - i; j++) {
if (arr[j] > arr[j+1]) {
swap(arr[j], arr[j+1]);
}
}
}
}
void selectSort(int arr[], int len){
if (arr == nullptr || len <= 0) {
return;
}
for (int i = 0; i < len - 1; i++) {
int min = i;
for (int j = i + 1; j < len; j++) {
if (arr[j] < arr[min]) {
min = j;
}
}
if (min != i) {
swap(arr[min], arr[i]);
}
}
}
void insertSort(int arr[], int len){
if (arr == nullptr || len <= 0) {
return;
}
for (int i = 1; i < len; i++) {
int j = i;
int value = arr[i];
while (j > 0 && arr[j-1] > value) {
arr[j] = arr[j-1];
--j;
}
if (j != i) {
arr[j] = value;
}
}
}
int partition(int arr[], int start, int end){
if (arr == nullptr || start < 0 || start > end) {
invalid_argument ex("invalid intput.");
throw exception(ex);
}
int pivot = start + rand() % (end - start + 1);
swap(arr[pivot], arr[end]);
pivot = start -1;
for (int i = start; i < end; i++) {
if (arr[i] < arr[end]) {
++pivot;
if (pivot != i) {
swap(arr[pivot], arr[i]);
}
}
}
++pivot;
swap(arr[pivot], arr[end]);
return pivot;
}
void quickSort(int arr[], int start, int end){
if (arr != nullptr && start < end) {
int pivot = partition(arr, start, end);
if (pivot > start) {
quickSort(arr, start, pivot -1);
}
if (pivot < end) {
quickSort(arr, pivot + 1, end);
}
}
}
void heapify(int arr[], int len, int root){
int left = root * 2 + 1;
int right = root * 2 + 2;
int max = root;
if (left < len && arr[left] > arr[max]) {
max = left;
}
if (right < len && arr[right] > arr[max]) {
max = right;
}
if (max != root) {
swap(arr[max], arr[root]);
heapify(arr, len, max);
}
}
void heapSort(int arr[], int len){
if (arr == nullptr || len <= 0) {
return;
}
for (int i = len/2 -1; i >= 0; i--) {
heapify(arr, len, i);
}
for (int i = len -1; i > 0; i--) {
swap(arr[0], arr[i]);
heapify(arr, i, 0);
}
}
void merge(int arr[], int left, int mid, int right){
int i, j, k;
int leftLen = mid - left + 1;
int rightLen = right - mid;
int leftArr[leftLen];
int rightArr[rightLen];
for (i = 0; i < leftLen; i++) {
leftArr[i] = arr[left + i];
}
for (j = 0; j < rightLen; j++) {
rightArr[j] = arr[mid + 1 + j];
}
i = 0; j = 0; k = left;
while (i < leftLen && j < rightLen) {
if (leftArr[i] <= rightArr[j]) {
arr[k] = leftArr[i];
++i;
} else {
arr[k] = rightArr[j];
++j;
}
++k;
}
while (i < leftLen) {
arr[k] = leftArr[i];
++i;
++k;
}
while (j < rightLen) {
arr[k] = rightArr[j];
++j;
++k;
}
}
void mergeSort(int arr[], int left, int right){
if (arr != nullptr && left < right) {
int mid = left + (right - left) / 2;
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
}
void countSort(int arr[], int len){
if (arr == nullptr || len <= 0) {
return;
}
int min = minValue(arr, len);
int max = maxValue(arr, len);
int range = max - min + 1;
int countArr[range];
memset(countArr, 0, sizeof(countArr));
for (int i = 0; i < len; i++) {
++countArr[arr[i] - min];
}
for (int j = 1; j < range; j++) {
countArr[j] += countArr[j-1];
}
int outputArr[len];
for (int i = 0; i < len; i++) {
outputArr[countArr[arr[i] - min] - 1] = arr[i];
--countArr[arr[i] - min];
}
for (int i = 0; i < len; i++) {
arr[i] = outputArr[i];
}
}