插入排序
#include<stdio.h>
void sort(int *array, int start, int end) {
int tmp,i,j;
for (i = start + 1; i < end; i++) {
tmp = array[i];
for (j = i - 1; j >= start; j--) {
if (array[j] > tmp) {
array[j+1] = array[j];
} else {
array[j+1] = tmp;
break;
}
}
if (j < start) {
array[j+1] = tmp;
}
}
}
int main() {
int a[10] = {1,5,2,8,7,4,3,9,0,6};
sort(a,0,10);
for(int i = 0; i < 10; i++) {
printf("%d ",a[i]);
}
return 0;
}
希尔排序
#include<stdio.h>
void sort(int *array, int start, int end, int dist) {
int tmp,i,j,k;
for (i = start; i < dist; i++) {
for (k = i + dist; k < end; k += dist) {
tmp = array[k];
for (j = k - dist; j >= start; j -= dist) {
if (array[j] > tmp) {
array[j+dist] = array[j];
} else {
array[j+dist] = tmp;
break;
}
}
if (j < start) {
array[j+dist] = tmp;
}
}
}
}
void shellsort(int *array, int start, int end, int delta[], int len) {
for (int i = 0; i < len; i++) {
sort(array, start, end, delta[i]);
}
}
int main() {
int a[10] = {1,5,2,8,7,4,3,9,0,6};
int delta[3] = {5,3,1};
shellsort(a,0,10,delta,3);
for(int i = 0; i < 10; i++) {
printf("%d ",a[i]);
}
return 0;
}
快速排序
#include<stdio.h>
void quicksort(int *array, int start, int end) {
if (start >= end-1) return;
int pivot = array[start];
int low = start;
int high = end - 1;
while (high > low) {
while (array[high] >= pivot && high > low) high--;
array[low] = array[high];
while (array[low] <= pivot && high > low) low++;
array[high] = array[low];
}
array[low] = pivot;
quicksort(array, start, low);
quicksort(array, low + 1, end);
}
int main() {
int a[10] = {1,5,2,8,7,4,3,9,0,6};
quicksort(a,0,10);
for(int i = 0; i < 10; i++) {
printf("%d ",a[i]);
}
return 0;
}
选择排序
#include<stdio.h>
void selectsort(int *array, int start, int end) {
int index;
int tmp;
for (int i = start; i < end; i++) {
index = array[i];
for (int j = i; j < end; j++) {
if (array[j] < array[index]) {
index = j;
}
}
tmp = array[i];
array[i] = array[index];
array[index] = tmp;
}
}
int main() {
int a[10] = {1,5,2,8,7,4,3,9,0,6};
selectsort(a,0,10);
for(int i = 0; i < 10; i++) {
printf("%d ",a[i]);
}
return 0;
}
冒泡排序
#include<stdio.h>
void bubblesort(int *array, int start, int end) {
int tmp;
for (int i = start; i < end; i++) {
for (int j = end - 1; j > i; j--) {
if (array[j] < array[j-1]) {
tmp = array[j];
array[j] = array[j-1];
array[j-1] = tmp;
}
}
}
}
int main() {
int a[10] = {1,5,2,8,7,4,3,9,0,6};
bubblesort(a,0,10);
for(int i = 0; i < 10; i++) {
printf("%d ",a[i]);
}
return 0;
}
堆排序
#include<stdio.h>
void heapadjust(int *array, int s, int m) {
int tmp = array[s];
for (int j = 2*s+1; j < m; j = 2*j+1) {
if (j < m-1 && array[j] < array[j+1]) ++j;
if (tmp > array[j]) break;
array[s] = array[j];
s = j;
}
array[s] = tmp;
}
void heapsort(int *array, int start, int end) {
int pos = (end + start) / 2;
int tmp;
for (int i = pos; i >= 0; i--) {
heapadjust(array, i, end);
}
for (int i = end-1; i > start; i--) {
tmp = array[i];
array[i] = array[start];
array[start] = tmp;
heapadjust(array, start, i);
}
}
int main() {
int a[10] = {1,5,2,8,7,4,3,9,0,6};
heapsort(a,0,10);
for(int i = 0; i < 10; i++) {
printf("%d ",a[i]);
}
return 0;
}
归并排序
#include<stdio.h>
void merge(int *array, int *tmparray, int start, int mid, int end) {
int i = start;
int j = mid;
int count = start;
while (i < mid && j < end){
if (array[i] <= array[j]) {
tmparray[count++] = array[i++];
}
if (array[i] > array[j]) {
tmparray[count++] = array[j++];
}
}
while (i < mid) {
tmparray[count++] = array[i++];
}
while (j < end) {
tmparray[count++] = array[j++];
}
for (int i = start; i < end; i++) {
array[i] = tmparray[i];
}
}
void mergesort(int *array, int *tmparray, int start, int end) {
if (start < end - 1) {
int mid = (start + end) / 2;
mergesort(array, tmparray, start, mid);
mergesort(array, tmparray, mid, end);
merge(array, tmparray, start, mid, end);
}
}
int main() {
int a[10] = {1,5,2,8,7,4,3,9,0};
int tmp[10] = {0};
mergesort(a,tmp,0,10);
for(int i = 0; i < 10; i++) {
printf("%d ",a[i]);
}
return 0;
}