#include <stdio.h>
void swap(int *a, int i, int j)
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
void print(int *a,int len)
{
int i;
for(i = 0;i < len;i++)
{
printf("%4d",a[i]);
}
printf("\n");
}
int main()//冒泡排序
{
int a[] = {2,1,4,6,9,7,8,0,3,5};
int len = sizeof(a) / sizeof(a[0]);
int i,j;
for(i = 0;i <len-1;i++)
{
for(j = 0;j < len-i-1;j++)
{
if(a[j] > a[j+1])
{
swap(a,j,j+1);
}
}
}
print(a,len);
return 0;
}
int main()//冒泡排序之鸡尾酒排序法
{
int a[] = {2,1,4,6,9,7,8,0,3,5};
int len = sizeof(a) / sizeof(a[0]);
int left = 0;
int right = len - 1;
int i;
while(left < right)//判断条件
{
for(i = left;i < right;i++)//从左到右最大数放在right位置
{
if(a[i] > a[i+1])
{
swap(a,i,i+1);
}
}
right--;
for(i = right;i > left;i--)//从右向左最小数放在left位置
{
if(a[i] < a[i-1])
{
swap(a,i,i-1);
}
}
left++;
}
print(a,len);
return 0;
}
int main()//选择排序
{
int a[] = {2,1,4,6,9,7,8,0,3,5};
int len = sizeof(a) / sizeof(a[0]);
int i,j;
int min;
for(i = 0;i < len;i++)
{
min = i;
for(j =i+1;j < len ;j++ )
{
if(a[min] > a[j])
{
min = j;
}
}
if(min != i)
{
swap(a,i,min);
}
}
print(a,len) ;
return 0;
}
int main()//插入排序
{
int a[] = {2,1,4,6,9,7,8,0,3,5};
int len = sizeof(a) / sizeof(a[0]);
int get;//保存待插入元素
int i;
int j;
for(i = 1;i < len;i++)
{
get = a[i];
j = i - 1;
//找到第一个比待插入元素小的元素,并进行移位
while(j >= 0 && a[j] > get)
{
a[j+1] = a[j];
j--;
}
a[j+1] = get;
}
print(a,len);
return 0;
}
int main()//插入排序之二分插入排序法
{
int a[10] = {2,1,4,6,9,7,8,0,3,5};
int len = sizeof(a) / sizeof(a[0]);
int i,j;
int get;
int left,right;
for(i = 1;i < len;i++)
{
get = a[i];
left = 0; //左边界
right = i - 1;//右边界 初始时,只有一个数,left和right指向同一个数
while(left <= right) // 找插入位置:查找完后要插入的位置在下标为left的位置
{
int mid = (left + right) / 2;
if( a[mid] > get) //判断插入位置
{
right = mid - 1; //插入左边,设定右边界
}
else
{
left = mid + 1; //插入右边,设定左边界
}
}
for(j = i - 1;j >= left;j--)//进行移位,将left开始右边的所有元素都右移一位
{
a[j+1] = a[j];
}
a[left] = get;
}
print(a,len);
return 0;
}
int main() //希尔排序
{
int a[] = {2,1,4,6,9,7,8,0,3,5};
int len = sizeof(a) / sizeof(a[0]);
int i,j;
int get;
int d = len; //d代表每一次的步长
do
{
d = d/3 +1;
for(i = d;i < len;i++)
{
get = a[i];
j = i - 1;
while(j >= 0 && a[j] > get)
{
a[j+1] = a[j];
j--;
}
a[j+1] = get;
}
}while(d > 1);
print(a,len);
return 0;
}
排序方法之冒泡(鸡尾酒)、选择、插入(二分插入)、希尔排序
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.