排序算法分类:
交换排序--------冒泡排序、快速排序
选择排序--------堆排序
插入排序--------希尔排序
归并排序
其他排序
最好手动模拟两遍。
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define M 10
int b[M];
void swap(int *a,int *b){
//交换两个数
int t=*a;
*a=*b;
*b=t;
}
void bubble_sort(int a[],int n){
//冒泡排序
int i,j;
for(i=0;i<n-1;i++){
bool flag=false;//当数组有序时,节约时间,避免不必要的比较
for(j=0;j<n-1-i;j++){
if(a[j]>a[j+1]){
swap(&a[j],&a[j+1]);
flag=true;
}
}
if(flag==false){
break;
}
}
}
void insert_sort(int a[],int n){
//插入排序
int i,j;
for(i=1;i<n;i++){
int t=a[i];//用变量t保存带插入值
for(j=i-1;j>=0&&a[j]>t;j--){//寻找插入位置
a[j+1]=a[j];//元素后移
}
a[j+1]=t;
}
}
void shell_sort(int a[],int n){
//希尔排序
int i,j,dk;
for(dk=(n-1)/2;dk>=1;dk/=2){//增量
for(i=dk;i<n;i++){//这里和插入排序思想相同
int t=a[i];
for(j=i-dk;j>=0&&a[j]>t;j-=dk){
a[j+dk]=a[j];
}
a[j+dk]=t;
}
}
}
void select_sort(int a[],int n){
//选择排序
int i,j;
for(i=0;i<n-1;i++){
int min=i;//保存最小值下标
for(j=i+1;j<n;j++){
if(a[j]<a[min]){
min=j;
}
}
if(min!=i){
swap(&a[min],&a[i]);
}
}
}
int part(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 high;//返回基准值下标
}
void quick_sort(int a[],int low,int high){
//快速排序
if(low<high){
int p=part(a,low,high);//按基准值分别对左右排序
quick_sort(a,low,p-1);
quick_sort(a,p+1,high);
}
}
void merge(int a[],int low,int mid,int high){
//归并排序->合并
int i,j,k;
for(k=low;k<=high;k++){//将原数组的值保存到新数组
b[k]=a[k];
}
i=low,j=mid+1,k=low;
while(i<=mid&&j<=high){
if(b[i]<b[j]){
a[k++]=b[i++];
}else{
a[k++]=b[j++];
}
}
while(i<=mid) a[k++]=b[i++];
while(j<=high) a[k++]=b[j++];
}
void merge_sort(int a[],int low,int high){
//归并排序
if(low<high){
int mid=(low+high)/2;
merge_sort(a,low,mid);
merge_sort(a,mid+1,high);
merge(a,low,mid,high);
}
}
//main方法
int main(){
int a[M];
generate(a,M);
printArr(a,M);
//bubble_sort(a,M);
//insert_sort(a,M);
//shell_sort(a,M);
//select_sort(a,M);
//quick_sort(a,0,M-1);
merge_sort(a,0,M-1);
printArr(a,M);
return 0;
}
void generate(int a[],int n){
//生成随机数组,调用了 c语言中的随机函数
int i;
srand(time(0));//为了生成不同的数组
for(i=0;i<n;i++){
a[i]=rand()%100+1;
}
}
void printArr(int a[],int n){
//输出数组
int i;
for(i=0;i<n;i++){
printf("%4d",a[i]);
}
printf("\n-------------------------\n");
}