几种排序算法的比较:
冒泡排序
#include <iostream>
using namespace std;
//冒泡排序
void bubble_sort(int array[],int size) {
int i, j;
for (i = size-1 ; i > 0; i--) {
for (j = 0; j < i ; j++) {
if (array[j] > array[j + 1]) {
int tmp = array[j];
array[j] = array[j + 1];
array[j + 1] = tmp;
}
}
}
}
int main(void) {
int src_array[10] = { 4,5,1,9,2,8,3,7,5,6 };
bubble_sort(src_array,10);
for (int i = 0; i < 10;i++) {
cout << src_array[i] << " ";
}
cout << endl;
return 0;
}
//递归版本
void sort(int array[], int size) {
int i, j;
for (i = size - 1; i > 0; i--) {
for (j = 0; j <= i; j++) {
if (array[j] > array[j + 1]) {
int tmp = array[j];
array[j] = array[j + 1];
array[j + 1] = tmp;
}
}
}
}
//冒泡排序
void bubble_sort(int array[], int size) {
if (size > 1) {
sort(array, size - 1);
}
}
选择排序
#include <iostream>
using namespace std;
//选择排序
void select_sort(int array[],int size) {
int i, j, min;
for (i = 0; i < size - 1; i++) { //总共需要进行N-1轮比较
min = i;
for (j = i + 1; j < size; j++) { //每轮需要进行N-i次比较
if (array[j] < array[min]) {
min = j; //记录找到的最小元素的位置
}
}
//进行值的互换
if (i != min) {
int tmp = array[i];
array[i] = array[min];
array[min] = tmp;
}
}
}
int main(void) {
int src_array[10] = { 4,5,1,9,2,8,3,7,5,6 };
select_sort(src_array,10);
for (int i = 0; i < 10;i++) {
cout << src_array[i] << " ";
}
cout << endl;
return 0;
}
插入排序
#include <iostream>
using namespace std;
//插入排序
void insert_sort(int array[],int size) {
// 从下标为1的元素开始选择合适的位置进行插入
for (int i = 1; i < size; i++) {
int tmp = array[i]; //记录要插入的数据
int j = i;
while (j > 0 && tmp < array[j - 1]) {
array[j] = array[j - 1];
j--;
}
if (j != i) //存在比其小的数,则插入
array[j] = tmp;
}
}
int main(void) {
int src_array[10] = { 4,5,1,9,2,8,3,7,5,6 };
insert_sort(src_array,10);
for (int i = 0; i < 10;i++) {
cout << src_array[i] << " ";
}
cout << endl;
return 0;
}
快速排序
#include <iostream>
using namespace std;
void myswap(int arr[], int a, int b) {
int tmp = arr[a];
arr[a] = arr[b];
arr[b] = tmp;
}
int partition(int arr[], int left, int right) {
int pivot = left;
int index = pivot + 1;
for (int i = index; i <= right; i++) {
if (arr[i] < arr[pivot]) {
myswap(arr, i, index);
index++;
}
}
myswap(arr, pivot, index - 1);
return index - 1;
}
//快速排序
void quick_sort(int array[], int left, int right) {
if (left < right) {
int parIndex = partition(array, left, right);
quick_sort(array, left, parIndex - 1);
quick_sort(array, parIndex + 1, right);
}
}
int main(void) {
int src_array[10] = {8,3,2,1,4,17,15,12,11,13};
quick_sort(src_array,0,9);
for (int i = 0; i < 10;i++) {
cout << src_array[i] << " ";
}
cout << endl;
return 0;
}
归并排序
#include <iostream>
#include <cstring>
using namespace std;
void merge(int arr[],int left,int right,int mid) {
int a = left, b = right, len = right - left + 1;
int k = mid + 1, i = 0;
int *array = new int[len];
while (a <= mid && k <= right) { //判断是否两个数组都检完
if (arr[a] <= arr[k])
array[i++] = arr[a++];
else
array[i++] = arr[k++];
}
while (a <= mid) { //第一个表还没检完
array[i++] = arr[a++];
}
while (k <= right) { //第二个表还没检完
array[i++] = arr[k++];
}
for (int j = 0; j < len; j++) { //拷贝回原来的数组
arr[left + j] = array[j];
}
delete[]array;
}
//归并排序
void merge_sort(int arr[], int left, int right) {
if (left < right) {
int mid = (left + right) / 2;
merge_sort(arr, left, mid);
merge_sort(arr,mid+1,right);
merge(arr, left, right, mid);
}
}
int main(void) {
int src_array[10] = { 4,5,1,9,2,8,3,7,5,6 };
merge_sort(src_array,0,9);
for (int i = 0; i < 10;i++) {
cout << src_array[i] << " ";
}
cout << endl;
return 0;
}
希尔排序
#include <iostream>
using namespace std;
void shell_sort(int array[],int n){
int gap = n/2;
while(gap > 0){
for(int i = 0; i < gap; i++){
for(int j = i + gap; j < n; j += gap){
if(array[j] < array[j-gap]){
int temp = array[j];
int k = j - gap;
while(k >= 0 && array[k] > temp){
array[k+gap] = array[k];
k -= gap;
}
array[k+gap] = temp;
}
}
}
gap /= 2;
}
}
int main(void) {
int src_array[10] = {4,5,1,9,2,8,3,7,5,6};
shell_sort(src_array,10);
for (int i = 0; i < 10;i++) {
cout << src_array[i] << " ";
}
cout << endl;
return 0;
}
堆排序
#include <iostream>
using namespace std;
void swap(int arr[], int a, int b) {
int tmp = arr[a];
arr[a] = arr[b];
arr[b] = tmp;
}
void heap_adjust(int arr[], int cur ,int n) {
int tmp, j;
tmp = arr[cur];
for (j = 2 * cur; j <= n; j *= 2) {
if (j < n && arr[j] < arr[j + 1])
++j;
if (tmp >= arr[j])
break;
arr[cur] = arr[j];
cur = j;
}
arr[cur] = tmp;
}
void heap_sort(int array[], int n) {
for (int i = n / 2; i > 0; i--)
heap_adjust(array, i, n);
for (int i = n; i > 1; i--) {
swap(array, 1, i);
heap_adjust(array, 1, i - 1);
}
}
int main() {
int src_array[11] = { 0,4,5,1,9,2,8,3,7,5,6 };
heap_sort(src_array, 10);
for (int i = 1; i < 11; i++) {
cout << src_array[i] << " ";
}
cout << endl;
return 0;
}