1.冒泡排序
思路:从头开始比较相邻的两个数,如果前者比后者大,则进行交换。每一轮排序结束,将最大的数放到数组后面。经过多次遍历即可排除大小顺序;这种排序方法在排序的过程中,是小的数就如气泡一样逐层上浮,而使大的数逐个下沉,于是就形象地取名为冒泡排序又名起泡排序。
第一轮排序:最大数88沉到底;
第二轮排序:只进行4次排序,88已经沉底无需再排;
第三轮排序:排3次,55沉底;
第四轮排序:排2次,32沉底;
第五轮排序:排一次,15沉底,结束。
代码如下:
#include <stdio.h>
#define SIZE 6
int main()
{
int a[SIZE]={32,54,15,5,88,67};
int i,j,t;
for(i=0;i<SIZE-1;i++)//n个数的数列总共扫描n-1次
{
for(j=0;j<SIZE-i-1;j++)//每一趟扫描到a[n-i-2]与a[n-i-1]比较为止结束
{
if(a[j]>a[j+1])//若后一位数比前一位数小,交换位置
{
t=a[j+1];
a[j+1]=a[j];
a[j]=t;
}
}
}
printf("从小到大的结果是:\n");
for(i=0;i<SIZE;i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
运行结果如下:
2.快速排序
思路:以某个数(假设第一个数)为基准temp,再定义两个位置头和尾分别为 i 和 j ,让 j 先开始向左动,遇到第一个小于 temp 的数停止移动,然后 i 开始向右移动遇到第一个大于 temp 的数停止移动,交换俩的位置,继续这个动作,直到 temp 左边的数小于 temp,右边的数大于 temp;然后以小于 temp 这边的第一个数为 temp 继续上述动作,直到排完左边,最后排右边;
1:j向左,i向右;
2:交换位置;
3:继续:
4:i = j ,和 temp 交换:
第一轮排序结束,temp左边小于它,右边大于它。
以左边为例,继续排序:
1.重新定义 i 和 j:
2:j向左,i向右;
3:交换位置;
4:继续:
5:i = j ,和 temp 交换:
至此,左边全部排完;右边按照同样的方法即可。
代码如下:
#include <stdio.h>
void Quick_Sort(int *arr, int begin, int end){
if(begin > end)
return;
int tmp = arr[begin];
int i = begin;
int j = end;
while(i != j){
while(arr[j] >= tmp && j > i)
j--;
while(arr[i] <= tmp && j > i)
i++;
if(j > i){
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
arr[begin] = arr[i];
arr[i] = tmp;
Quick_Sort(arr, begin, i-1);
Quick_Sort(arr, i+1, end);
}
int main()
{
int arr[]={5,4,8,1,2,7,6,3,9};
int i;
Quick_Sort(arr,0,9);
printf("从小到大的结果是:\n");
for(i=0;i<9;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
运行结果如下:
3.选择排序
思路:开始选择最小(最大)的元素,放到第一个位子,再选择次小(次大)的元素放到第二的位置,以此类推,直到排序结束。(选择排序是不稳定的排序方法)
比如我们需要排序的数字为:5,9,8,7,3,1,6,4,2
假设需要升序
第一轮:遍历9个数字,从中找出最小的数字放到第1位
排序后的结果为:1,9,8,7,3,5,6,4,2
第二轮:遍历其余8个数字,从中找出最小的数字放到第2位
排序后的结果为:1,2,8,7,3,5,6,4,9
第二轮:遍历其余7个数字,从中找出最小的数字放到第3位
排序后的结果为:1,2,3,7,8,5,6,4,9
…
最后,排序结果为:1,2,3,4,5,6,7,8,9
代码如下:
#include <stdio.h>
#define N 9
void in_put();
void sort();
void out_put();
int main()
{
int a[N] = {0};
int i ;
for(i = 0;i < N;i++)
{
scanf("%d",&a[i]);
}
sort(a,N);
out_put(a);
return 0;
}
void sort(int *p,int n)
{
int i,j,min = 0;
for(i = 0;i < N-1;i++)
{
min = i;
for(j = i+1;j < N;j++)
{
if(p[j] < p[min])
min = j;
}
if(i != min)
{
int temp;
temp = p[min];
p[min] = p[i];
p[i] = temp;
}
}
}
void out_put(int *p)
{
int i;
for(i = 0;i<N;i++)
{
printf("%d,",p[i]);
}
printf("\n");
}
4.插入排序
思路:从第二个数开始,依次和其前面的所有数进行比较遇到第一个小于它的数,插到其后面,直到遍历完所有数为止。
以上面图片为例:
开始顺序为:3,44,38,5,47,15,36,26,27,2,46,4,19,50,48
第1次遍历结果为:3,44,38,5,47,15,36,26,27,2,46,4,19,50,48
第2次遍历结果为:3,38,44,5,47,15,36,26,27,2,46,4,19,50,48
第3次遍历结果为:3,5,38,44,47,15,36,26,27,2,46,4,19,50,48
第4次遍历结果为:3,5,38,44,47,15,36,26,27,2,46,4,19,50,48
第5次遍历结果为:3,5,15,38,44,47,36,26,27,2,46,4,19,50,48
第6次遍历结果为:3,5,15,36,38,44,47,26,27,2,46,4,19,50,48
第7次遍历结果为:3,5,15,26,36,38,44,47,27,2,46,4,19,50,48
第8次遍历结果为:3,5,15,26,27,36,38,44,47,2,46,4,19,50,48
第9次遍历结果为:2,3,5,15,26,27,36,38,44,47,46,4,19,50,48
第10次遍历结果为:2,3,5,15,26,27,36,38,44,46,47,4,19,50,48
第11次遍历结果为:2,3,4,5,15,26,27,36,38,44,46,47,19,50,48
第12次遍历结果为:2,3,4,5,15,19,26,27,36,38,44,46,47,50,48
第13次遍历结果为:2,3,4,5,15,19,26,27,36,38,44,46,47,50,48
第14次遍历结果为:2,3,4,5,15,19,26,27,36,38,44,46,47,48,50
结束
代码如下:
void InsertSort(int* arr, int n)
{
for (int i = 0; i < n - 1; ++i)
{
//记录有序序列最后一个元素的下标
int end = i;
//待插入的元素
int tem = arr[end + 1];
//单趟排
while (end >= 0)
{
//比插入的数大就向后移
if (tem < arr[end])
{
arr[end + 1] = arr[end];
end--;
}
//比插入的数小,跳出循环
else
{
break;
}
}
//tem放到比插入的数小的数的后面
arr[end + 1] = tem;
//代码执行到此位置有两种情况:
//1.待插入元素找到应插入位置(break跳出循环到此)
//2.待插入元素比当前有序序列中的所有元素都小(while循环结束后到此)
}
}
刚学习,请大家批评指正!