目录
1.冒泡排序-bubble
思路:
1.从第一个数开始,将左右元素依次进行比较,交换,始终保持右边大于左边(第一次结束后,最右边为最大值)
2.对序列中剩下的n-1个元素再次执行 把最后一位确定下来
思维流程图:
代码实现:
2.插入排序-insert
思路:
数组分为两部分
将数组中所有元素依次和前面已经排好顺序的元素比较,如果选择的元素比已排序的元素小,则交换,直到都比较过
- 用key将往前插入的元素保存起来a[i]=key
- 将key与已经排好的元素比较
- 若key<a[i-1]就交换(i--)
流程图
代码实现:
3.选择排序-select
思路:
找到最大+交换
- 从元素中找到最大
- 若最大元素不是最后一个,则与最后一个元素(n)交换
- n--;
- 从剩下的元素中,重复1-3
流程图:
代码实现
4.希尔排序-shell
思路:
- 将数组按照inc(n/2)长度进行分组,依次对各组分别进行插入排序
- 排完后inc变为1/2,重复上述操作
- 当inc=1时,直接对全体插入排序
流程图:
代码实现:
5.快速排序-quick
思路:
- 任取一个元素(如:第一个)为中心 ->point
- 所有比point小的元素放前面,所有大的放后面。形成左右两个子表
- 对各子表重新选择中心元素并重复步骤2->递归思想
- 直到每个子表的元素只剩下一个
流程图
代码实现
#include <stdio.h>
void swap(int a[],int low, int high)
{
int temp;
temp = a[low];
a[low] = a[high];
a[high] = temp;
}
int partition(int a[], int low, int high)//low=0;high=n-1
{
int point;//找枢纽元素
point = a[low];//把枢纽元素放最左边
while(low < high)//俩指针还没相遇
{
while( low < high && a[high] >= point)
{
high--;
}
swap(a,low,high);
while( low < high && a[low] <= point)
{
low++;
}
swap(a,low,high);
}
return low;
}
void quick(int a[], int low, int high)//low数组起始位置 high数组结束位置
{
int point;
if ( low < high )
{
point = partition(a,low,high);
quick(a, low, point-1);
quick(a, point+1, high);
}
}
void quicksort(int a[],int n)
{
quick(a, 0, n-1);//数组 初始位置 最后一个位置
}
//辅助函数:打印数组
void print_arr ( int arr[], int n)
{
for (int i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int main(void)
{
int a[10]={5,2,6,0,3,9,1,7,4,8,};
quicksort(a,10);
print_arr(a, 10);
}
6.归并排序-marge
基本思想:
先拆分数组,再合并数组
- 创建临时数组,存储排序完的数组
- 找到中间点,left right mid 划分数组 直到一个小数组有一个元素
- 2路合并
流程图
代码实现
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
//辅助数组B
int *B = (int *)malloc((7+1)*sizeof(int));
void Merge(int A[], int low, int mid, int high)
{
int i, j,k;
//表A的两段A[low...mid]和A[mid+1...high]各自有序
//将他们合并成为一个有序表
for(int k = low; k<=high; k++){
B[k] = A[k];
}
for(i = low, j = mid+1, k=i; i<=mid&&j<=high; k++)
{
if(B[i]<=B[j])
A[k] = B[i++]; //A[]把之前的数据覆盖
else
A[k] = B[j++];
}
//若第一个表为检测完成,复制
while(i<=mid) A[k++] = B[i++];
//若第二个表为检测完成,复制
while(j<=high) A[k++] = B[j++];
}
void MerSort(ElemType A[], int low, int high)
{
if (low<high)
{
int mid = (low+high)/2;
MerSort(A,low,mid);
MerSort(A,low+1,high);
Merge(A,low,mid,high);
}
}
int main()
{
int arr[] = {2,5,7,10,4,8,6,9,};
int low = 0;
int high = 7;
int M;
int i;
MerSort(arr, low, high);
for (i=0; i<=high; i++) {
printf("%d ",arr[i]);
}
}