1.插入排序
(1).直接插入排序
#include <stdio.h>
#include <stdlib.h>
void insertSort1(int a[],int n) {
for(int i = 2; i <= n; i ++) {
a[0] = a[i];
int j;
for(j = i - 1; a[j] > a[0]; j --) {
a[j + 1] = a[j];
}
a[j + 1] = a[0];
}
return ;
}
void insertSort2(int a[],int n) {
for(int i = 2; i <= n; i ++) {
a[0] = a[i];
int j;
for(j = i - 1; j >= 1; j --) {
if(a[j] > a[0]) {
a[j + 1] = a[j];
} else {
break;
}
}
a[j + 1] = a[0];
}
return ;
}
int main() {
int a[12];
printf("请输入要排序的序列:\n");
for(int i = 1; i <= 10; i ++) {
scanf("%d",&a[i]);
}
insertSort1(a,10);
printf("直接插入排序 排序后的序列:\n");
for(int i = 1; i <= 10; i ++) {
printf("%d ",a[i]);
}
return 0;
}
(2).折半插入排序
#include <stdio.h>
#include <stdlib.h>
void middleInsertSort(int a[],int n) {
for(int i = 2; i <= n; i ++) {
a[0] = a[i];
int low = 1,high = i - 1;
while(low <= high) {
int mid = low + high >> 1;
if(a[mid] > a[0]) high = mid - 1;
else low = mid + 1;
}
for(int j = i - 1; j >= low; j --) {
a[j + 1] = a[j];
}
a[low] = a[0];
}
return ;
}
int main() {
int a[12];
printf("请输入要排序的序列:\n");
for(int i = 1; i <= 10; i ++) {
scanf("%d",&a[i]);
}
middleInsertSort(a,10);
printf("折半插入排序 排序后的序列:\n");
for(int i = 1; i <= 10; i ++) {
printf("%d ",a[i]);
}
return 0;
}
(3).希尔排序
#include <stdio.h>
#include <stdlib.h>
void shellSort(int a[],int n) {
for(int d = n / 2; d >= 1; d /= 2) {
for(int i = 1; i < d + 1; i ++) {
for(int j = i + d; j <= n; j ++) {
a[0] = a[j];
int k;
for(k = j - d; k > 0 && a[k] < a[0]; k -= d) {
a[k + d] = a[k];
}
a[k + d] = a[0];
}
}
}
return ;
}
int main() {
int a[12];
printf("请输入要排序的序列:\n");
for(int i = 1; i <= 10; i ++) {
scanf("%d",&a[i]);
}
shellSort(a,10);
printf("希尔排序 排序后的序列:\n");
for(int i = 1; i <= 10; i ++) {
printf("%d ",a[i]);
}
return 0;
}
2.交换排序
(1).冒泡排序
#include <stdio.h>
#include <stdlib.h>
void bubbleSortOne(int a[],int n) {
for(int i = 1; i < n; i ++) {
for(int j = n; j > i; j --) {
if(a[j] > a[j - 1]) {
int temp = a[j];
a[j] = a[j - 1];
a[j - 1] = temp;
}
}
}
return ;
}
void bubbleSortTwo(int a[],int n) {
for(int i = n; i > 1; i --) {
for(int j = 1; j < i; j ++) {
if(a[j] > a[j + 1]) {
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
return ;
}
int main() {
int a[12];
printf("请输入要排序的序列:\n");
for(int i = 1; i <= 10; i ++) {
scanf("%d",&a[i]);
}
bubbleSortTwo(a,10);
printf("冒泡排序(元素下标从 1 开始,从前往后冒泡) 排序后的序列:\n");
for(int i = 1; i <= 10; i ++) {
printf("%d ",a[i]);
}
return 0;
}
(2).快速排序
#include <stdio.h>
#include <stdlib.h>
int partition(int a[],int low,int high) {
int pivot = a[low];
while(low < high) {
while(low < high && a[high] >= pivot) high --;
a[low] = a[high];
while(low < high && a[low] <= pivot) low ++;
a[high] = a[low];
}
a[low] = pivot;
return low;
}
void quickSort(int a[],int low,int high) {
if(low < high) {
int pos = partition(a,low,high);
quickSort(a,low,pos - 1);
quickSort(a,pos + 1,high);
}
return ;
}
int main() {
int a[12];
printf("请输入要排序的序列:\n");
for(int i = 1; i <= 10; i ++) {
scanf("%d",&a[i]);
}
quickSort(a,1,10);
printf("快速排序 排序后的序列:\n");
for(int i = 1; i <= 10; i ++) {
printf("%d ",a[i]);
}
return 0;
}
3.选择排序
(1).简单选择排序
#include <stdio.h>
#include <stdlib.h>
void selectSort(int a[],int n) {
for(int i = 1; i <= n; i ++) {
int pos = i,value = a[i];
for(int j = i + 1; j <= n; j ++) {
if(a[j] < value) {
value = a[j];
pos = j;
}
}
int temp = a[pos];
a[pos] = a[i];
a[i] = temp;
}
return ;
}
int main() {
int a[12];
printf("请输入要排序的序列:\n");
for(int i = 1; i <= 10; i ++) {
scanf("%d",&a[i]);
}
selectSort(a,10);
printf("简单选择排序 排序后的序列:\n");
for(int i = 1; i <= 10; i ++) {
printf("%d ",a[i]);
}
return 0;
}
(2).堆排序
#include <stdio.h>
#include <stdlib.h>
void swap(int arr[],int i,int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
return ;
}
void heapify(int tree[],int n,int i) {
if(i >= n) return ;
int c1 = 2 * i + 1;
int c2 = 2 * i + 2;
int max = i;
if(c1 < n && tree[c1] > tree[max]) {
max = c1;
}
if(c2 < n && tree[c2] > tree[max]) {
max = c2;
}
if(max != i) {
swap(tree,i,max);
heapify(tree,n,max);
}
return ;
}
void build_heap(int tree[],int n) {
int last_node = n - 1;
int parent = (last_node - 1) / 2;
int i;
for(int i = parent;i >= 0; i --) {
heapify(tree,n,i);
}
return ;
}
void heap_sort(int tree[],int n) {
build_heap(tree,n);
int i;
for(int i = n - 1; i >= 0; i --) {
swap(tree,i,0);
heapify(tree,i,0);
}
return ;
}
int main() {
int tree[] = {2,5,90,1,10,4};
int n = 6;
heap_sort(tree,n);
for(int i = 0; i < n; i ++) {
printf("%d ",tree[i]);
}
return 0;
}
4.归并排序
#include <stdio.h>
#include <stdlib.h>
void merge(int a[],int low,int mid,int high) {
int b[12];
for(int i = low; i <= high; i ++) {
b[i] = a[i];
}
int i = low,j = mid + 1,k = low;
while(i <= mid && j <= high) {
if(b[i] > b[j]) {
a[k ++] = b[j ++];
} else {
a[k ++] = b[i ++];
}
}
while(i <= mid) a[k ++] = b[i ++];
while(j <= high) a[k ++] = b[j ++];
return ;
}
void mergeSort(int a[],int low,int high) {
if(low < high) {
int mid = low + high >> 1;
mergeSort(a,low,mid);
mergeSort(a,mid + 1,high);
merge(a,low,mid,high);
}
return ;
}
int main() {
int a[12];
printf("请输入要排序的序列:\n");
for(int i = 1; i <= 10; i ++) {
scanf("%d",&a[i]);
}
mergeSort(a,1,10);
printf("归并排序 排序后的序列:\n");
for(int i = 1; i <= 10; i ++) {
printf("%d ",a[i]);
}
return 0;
}
|