几个常用的排序算法:插入排序、快速排序、归并排序

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
/************************************************
* 插入排序法
* 第1次循环: 5, 3, 4, 6, 2, 1 -> 5, 5, 4, 6, 2, 1 -> 3, 5, 4, 6, 2, 1
* 第2次循环: 3, 5, 4, 6, 2, 1 -> 3, 5, 5, 6, 2, 1 -> 3, 4, 5, 6, 2, 1
* 第4次循环: 3, 4, 5, 6, 2, 1 -> 3, 3, 4, 5, 6, 1 -> 2, 3, 4, 5, 6, 1
* 第5次循环: 2, 3, 4, 5, 6, 1 -> 2, 2, 3, 4, 5, 6 -> 1, 2, 3, 4, 5, 6
************************************************/
void insert_sort(int *arr, int n){
int i = , j = , tmp = ;
for( i = ; i < n; i++ ){
if( arr[i-] > arr[i] ){
tmp = arr[i];
for( j = i - ; arr[j] > tmp && j >= ; j-- ){
arr[j+] = arr[j];
}
arr[j+] = tmp;
}
/*
printf("the %d times iteration : ",i);
for( int j = 0 ; j < n; j++ ){
printf("%2d ",arr[j]);
}
printf("\n");
*/
}
}
/************************************************
* 快速排序法
************************************************/
int partition(int *arr, int low, int high){
int tmp = arr[low];
while( low < high ){
while( low < high && arr[high]>= tmp ) high--;
arr[low] = arr[high];
while( low < high && arr[low] <= tmp ) low++;
arr[high] = arr[low];
}
arr[low] = tmp;
return low;
}
void q_sort(int *arr, int low, int high){
int pivot = ;
while( low < high ){
pivot = partition( arr,low,high ); // 对arr一分为二
q_sort( arr,low,pivot- ); // 低子表递归排序
low = pivot + ; // 尾递归
}
}
/************************************************
* 2分归并排序
************************************************/
void merge_sort( int *arr,int *tmp,int s_idx,int m_idx,int e_idx){
int i = s_idx, j = m_idx+, k = s_idx;
while( i != m_idx+ && j != e_idx+ ){
if( arr[i] < arr[j] ){
tmp[k++] = arr[i++];
}
else{
tmp[k++] = arr[j++];
}
}
while( i != m_idx+ ){
tmp[k++] = arr[i++];
}
while( j != e_idx+ ){
tmp[k++] = arr[j++];
}
for( i = s_idx;i <= e_idx;i++ ){
arr[i] = tmp[i];
}
}
void m_sort(int *arr,int *tmp,int s_idx,int e_idx){
if( s_idx < e_idx ){
int mid = (s_idx + e_idx) / ; // 将arr分为arr[0..mid]和arr[mid+1..n-1]
m_sort( arr,tmp,s_idx,mid); // 递归将arr[0..mid]归并为有序的tmp[0..mid]
m_sort( arr,tmp,mid+,e_idx); // 递归将arr[mid+1..n-1]归并为有序的tmp[mid+1..n-1]
merge_sort( arr,tmp,s_idx,mid,e_idx); // 将arr[0..mid]和arr[mid+1..n-1]归并到tmp[0..n-1]
}
}
/************************************************
* 反转序列
************************************************/
void reverse(int *arr, int n){
int s_idx = , e_idx = n - ;
int tmp = ;
while( s_idx < e_idx ){
tmp = arr[s_idx];
arr[s_idx++] = arr[e_idx];
arr[e_idx--] = tmp;
}
}
void show_arr(int *arr, int n){
for( int i = ; i < n; i++ ){
printf("%2d ",arr[i]);
}
printf("\n");
}
/************************************************
* 二分查找
* 数组 1 2 3 4 5 6 查找 5
* | | |
* low mid high
* 循环1次:
* 1 2 3 4 5 6 查找 5
* | | |
* low mid high
************************************************/
bool binary_search(int *arr, int n, int key){
if( NULL == arr ) return false;
int low = , high = n - , mid = ; // low为数组首位,high为数组末位
while( low < high ){
mid = low + (( high - low ) >> ); //防止溢出,移位也更高效。每次循环都要更新。
if( key < arr[mid] ){ // 若关键字小于中值
high = mid - ; // 高下标调整到中下标小1
}
else if( key > arr[mid] ){ // 若关键字大于中值
low = mid + ; // 低下标调整到中下标加1
}
else{
return true;
}
}
return false;
}
int main(){
int i = ;
int arr[] = {, , , , , , };
int len = sizeof(arr)/sizeof(arr[]);
int tmp[len];
m_sort(arr,tmp,,len-);
printf("m_sort:\n");
show_arr(arr,len); reverse(arr,len);
insert_sort(arr,len);
printf("insert_sort:\n");
show_arr(arr,len); reverse(arr,len);
q_sort(arr,,len-);
printf("q_sort:\n");
show_arr(arr,len); int key = ;
printf("%d is%s in the arr\n",key,( binary_search(arr,len,key) ) ? "" : " not");
}

  输出:

m_sort:
1 2 3 4 5 6
insert_sort:
1 2 3 4 5 6
q_sort:
1 2 3 4 5 6

5 is in the arr

最新文章

  1. css3 linear-gradient实现购物车地址选择信封效果
  2. FPGrowth算法总结复习
  3. linux一些常用命令
  4. 虚幻引擎4笔记20160821 - 使用GPU粒子做雪花旋转镜头雪花忽有忽无的问题
  5. .NET core mvc on Docker
  6. 安装完成Windows服务后自动打开
  7. DMA-330(二)
  8. Linux C 程序 指针数组和二级指针(TEN)
  9. bug修复复盘
  10. SQL Server 中的跨库视图
  11. Foundation 框架 NSFileManager,NSData 简单的文件操作
  12. cpp(第八章)
  13. char对比varchar
  14. Sumo生成数据
  15. LeetCode 557 Reverse Words in a String III 解题报告
  16. 当BeanUtils遇到泛型
  17. javascript UI框架
  18. angularjs中的验证input输入框只能输入数字和小数点
  19. SpringBoot之actuator
  20. iOS- Swift:指触即开,如何集成Touch ID指纹识别功能

热门文章

  1. object-c 连接mysql
  2. 视觉AI风口一触即发,虹软AI沙龙点金深圳
  3. org.apache.shiro.session.UnknownSessionException: There is no session with id [xxxx]的解决方案
  4. 浅谈 form 表单提交
  5. mybatis的XML中注释需谨慎
  6. C#编译相关知识
  7. mysql安装好需要启动和停止服务
  8. 如何防护DDOS攻击策略
  9. Handling skewed data---Error metrics for skewed(偏斜的) classes(precision&amp;recall)
  10. maven 热部署