1 堆排序
#include <iostream>
using namespace std;
//堆排序
//交换两个数
void myswap(int& a, int& b) {
a ^= b;
b ^= a;
a ^= b;
}
void maxheap(int* arr, int start, int end) {
//根节点是从0开始
int dad = start;
int son = dad * 2 + 1;
while (son <= end) {
//先比较左孩子和右孩子的大小
if (son + 1 <= end && arr[son + 1] > arr[son])
son++;
if (arr[dad] > arr[son])
return ;
else {
myswap(arr[son], arr[dad]);
dad = son;
son = dad * 2 + 1;
}
}
}
void heapsort(int* arr, int len) {
for (int i = len / 2 - 1; i >= 0; i--)
maxheap(arr, i, len - 1);
for (int i = len - 1; i > 0; i--) {
myswap(arr[i], arr[0]);
maxheap(arr, 0, i - 1);
}
}
void test() {
int arr[] = { 1,4,3,8,3 };
heapsort(arr, 5);
for (int i = 0; i < 5; i++) {
cout << arr[i] << endl;
}
}
int main() {
test();
system("pause");
return 0;
}
2 快速排序
#include <iostream>
#include <algorithm>
using namespace std;
//快速排序
void quicksort(int* arr, int left, int right) {
if (left >= right)
return;
int l = left;
int r = right;
int key = arr[l];
while (l < r) {
while (l < r && key <= arr[r])
r--;
arr[l] = arr[r];
while (l < r && key >= arr[l])
l++;
arr[r] = arr[l];
}
arr[l] = key;
quicksort(arr, left, l - 1);
quicksort(arr, l + 1, right);
}
void test() {
int arr[] = { 1,4,3,8,3 };
quicksort(arr, 0, 4);
for (int i = 0; i < 5; i++) {
cout << arr[i] << endl;
}
}
int main() {
test();
system("pause");
return 0;
}
3 分治排序/二分排序/归并排序
#include <iostream>
using namespace std;
void merge(int* arr,int* brr,int left,int right){
int i = left; //第一小段起始位置
int mid = left + (right-left)/2; //中间位置
int j = mid + 1; //第二小段起始位置
int k = leftp; //临时数组的起始位置
while(i <= mid && j <= right){
if(arr[i] < arr[j])
brr[k++] = arr[i++];
else
brr[k++]= arr[j++];
}
while(i <= mid)
brr[k++] = arr[i++];
while(j <= right)
brr[k++] = arr[j++]
for(int m = left;m <= right;m++)
arr[m] = brr[m];
}
void mergesort(int* arr,int* brr,int left,int right){
if(left < right){//并
void merge(int* arr, int* brr, int left, int right) {
int i = left; //第一小段起始位置
int mid = left + (right - left) / 2; //中间位置
int j = mid + 1; //第二小段起始位置
int k = left; //临时数组的起始位置
while (i <= mid && j <= right) {
if (arr[i] < arr[j])
brr[k++] = arr[i++];
else
brr[k++] = arr[j++];
}
while (i <= mid)
brr[k++] = arr[i++];
while (j <= right)
brr[k++] = arr[j++];
for (int m = left; m <= right; m++)
arr[m] = brr[m];
}
void mergesort(int* arr, int* brr, int left, int right) {
if (left < right) {
int mid = left + (right - left) / 2;
mergesort(arr, brr, left, mid);
mergesort(arr, brr, mid + 1, right);
merge(arr, brr, left, right);
}
}
void test() {
int arr[] = { 1,4,3,8,3 };
int* brr = new int[5];
mergesort(arr, brr, 0, 4);
for (int i = 0; i < 5; i++) {
cout << arr[i] << endl;
}
}
int main() {
test();
system("pause");
return 0;
}
int mid = left + (right - left)/2;
mergesort(arr,brr,left,mid);
mergesort(arr,brr,mid+1,right);
merge(arr,brr,left,right);
}
}