1、冒泡排序
#include<stdio.h>
void main(){
int i,j;
int s[10]={10,2,34,24,15,89,100,1,50,90};
for( i=0;i<10;i++)
printf("%d ",s[i]);
printf("\n"); //输出排序前
for(i=0;i<10;i++){
for(j=0;j<9;j++){
if(s[i]<s[j]){
int temp = s[i];
s[i] = s[j];
s[j] = temp;
}
}
}
for(i=0;i<10;i++)
printf("%d ",s[i]);
printf("\n"); //输出排序后
}
2、直接插入排序
#include<stdio.h>
void main(){
int i,j,temp;
int s[10]={10,2,34,24,15,89,100,1,50,90};
for( i=0;i<10;i++)
printf("%d ",s[i]);
printf("\n"); //输出排序前
for(i=0;i<10;i++){
temp = s[i]; //当前操作元素
for(j=i-1;j>=-1&&s[j]>temp;j--){
s[j+1] = s[j];
s[j] = temp;
}
}
for(i=0;i<10;i++)
printf("%d ",s[i]);
printf("\n"); //输出排序后
}
3、希尔排序
#include<stdio.h>
void main(){
int i,j,temp,gap;
int s[10]={10,2,34,24,15,89,100,1,50,90};
for( i=0;i<10;i++)
printf("%d ",s[i]);
printf("\n"); //输出排序前
for(gap=10/2;gap>0;gap/=2){ //gap表示步长,每次减半,直到减到1
for(i=gap;i<10;i++){ //定位到每一个元素
for(j=i-gap;(j>=0)&&(s[j]>s[j+gap]);j-=gap)
//比较相距gap远的两个元素的大小,根据排序方向决定如何调换
{
temp = s[j];
s[j] = s[j+gap];
v[j+gap] = temp;
}
}
}
for(i=0;i<10;i++)
printf("%d ",s[i]);
printf("\n"); //输出排序后
}
4、快速排序
/*
先找到第一个数--10,把它作为中间值,也就是说,要把10放在一个位置,
使得它左边的值比它小,右边的值比它大。这样一个数组的排序就变成了
两个小数组的排序--10左边的数组和10右边的数组,而这两个数组继续用
同样的方式继续下去,一直到顺序完全正确。
*/
#include<stdio.h>
void quicksort(int a[],int left,int right)
{
int i,j,temp;
i=left;
j=right;
temp=a[left];
if(left>right)
return;
while(i!=j)
{
while(a[j]>=temp&&j>i) //发现左边有大于temp的数,则交换
j--;
if(j>i)
a[i++]=a[j];
while(a[i]<=temp&&j>i) //发现右边有小于temp的数,则交换
i++;
if(j>i)
a[j--]=a[i];
}
a[i]=temp;
quicksort(a,left,i-1);
quicksort(a,i+1,right);
}
void main(){
int i;
int s[10]={10,2,34,24,15,89,100,1,50,90};
for( i=0;i<10;i++)
printf("%d ",s[i]);
printf("\n"); //输出排序前
quicksort(s,0,9);
for(i=0;i<10;i++)
printf("%d ",s[i]);
printf("\n"); //输出排序后
}
5、选择排序
#include<stdio.h>
void main(){
int i,j,min;
int s[10]={10,2,34,24,15,89,100,1,50,90};
for( i=0;i<10;i++)
printf("%d ",s[i]);
printf("\n"); //输出排序前
for(i=0;i<10;i++){
min=i;
for(j=i+1;j<10;j++){ // 从j往前的数据都是排好的,所以从j开始往下找剩下的元素中最小的
if(s[min]>s[j]){ //把剩下元素中最小的那个放到A[i]中
int temp = s[i];
s[i] = s[j];
s[j] = temp;
}
}
}
for(i=0;i<10;i++)
printf("%d ",s[i]);
printf("\n"); //输出排序后
}
6、二分插入排序
#include <stdio.h>
void HalfInsertSort(int a[], int len)
{
int i, j,temp;
int low, high, mid;
for (i=1; i<len; i++)
{
temp = a[i]; // 保存但前元素
low = 0;
high = i-1;
while (low <= high) //在a[low...high]中折半查找有序插入的位置
{
mid = (low + high) / 2; // 找到中间元素
if(a[mid] > temp){ // 如果中间元素比但前元素大,当前元素要插入到中间元素的左侧
high = mid-1;
}else{ // 如果中间元素比当前元素小,但前元素要插入到中间元素的右侧
low = mid+1;
}
} // 找到当前元素的位置,在low和high之间
for (j=i-1; j>high; j--) // 元素后移
a[j+1] = a[j];
a[high+1] = temp; // 插入
}
}
void main(){
int i;
int s[10]={10,2,34,24,15,89,100,1,50,90};
for( i=0;i<10;i++)
printf("%d ",s[i]);
printf("\n"); //输出排序前
HalfInsertSort(s,10);
for(i=0;i<10;i++)
printf("%d ",s[i]);
printf("\n"); //输出排序后
}