排序----冒泡排序的优化_选择排序_插入排序

来源:互联网 发布:澳大利亚学生签证知乎 编辑:程序博客网 时间:2024/06/14 04:37

"test.c"

<span style="font-size:18px;">#define _CRT_SECURE_NO_WARNINGS 1#include "Sort.h"int main(){int arr[] = {6,3,8,1,4,9,5,0,2,7};int size = sizeof(arr)/sizeof(arr[0]);BubbingSort(arr,size);//SelectSort(arr,size);//InsertSort(arr,size);PrintSort(arr,size);system("pause");return 0;}</span>



"Sort.h"

<span style="font-size:18px;">#ifndef __SORT_H__#define __SORT_H__#include<stdio.h>#include <stdlib.h>#include <assert.h>void SelectSort(int* arr,int size);//选择排序void InsertSort(int* arr,int size);//直接插入排序void BubbingSort(int* arr,int size);//冒泡排序void PrintSort(int* arr,int size);#endif//__SORT_H__</span>


 

"Sort.c"

<span style="font-size:18px;">#define _CRT_SECURE_NO_WARNINGS 1#include "Sort.h"//void BubbingSort(int* arr,int size)//{//int i = 0;//int j = 0;//int tmp = 0;//assert(arr);////for (i = 0;i < size-1; i++)  //排序的趟数//{//for (j = 0;j < size-1-i;j++)//每次排序的个数//{//if (arr[j] > arr[j+1])//升序//{//tmp = arr[j];//arr[j] = arr[j+1];//arr[j+1] = tmp;//}//}//}//}//优化一次后的冒泡排序  优化趟数  优化后的排序算法对已经有序的部分数组值将不再进行排序,减少复杂度 //void BubbingSort(int* arr,int size)//{//int i = 0;//int j = 0;//int tmp = 0;//int flag = 0;//标记//assert(arr);////for (i = 0;i < size-1; i++)  //排序的趟数//{//flag = 0;//for (j = 0;j < size-1-i;j++)//每次排序的个数//{//if (arr[j] > arr[j+1])//升序//{//tmp = arr[j];//arr[j] = arr[j+1];//arr[j+1] = tmp;//flag = 1;//如果交换过了那么就将标记变换//}//}//if (flag == 0)//如果经过一趟的排序,没有任何一个数组的值交换,那么表明数组中已经有序//{//break;//}//}//}//优化两次后的冒泡排序     优化趟数里次数的比较void BubbingSort(int* arr,int size){int i = 0;int j = 0;int tmp = 0;int flag = 0;//标记int m = size-i-1;//初始化为冒泡排序比较次数的限制条件int n = 0;assert(arr);for (i = 0;i < size-1; i++)  //排序的趟数{flag = 0;for (j = 0;j < m;j++)//每次排序的个数{if (arr[j] > arr[j+1])//升序{tmp = arr[j];arr[j] = arr[j+1];arr[j+1] = tmp;flag = 1;//如果交换过了那么就将标记变换n = j;   //记录当前交换了数值的下标}}m = n; //将记录下来的下标值赋值给j循环的限制条件if (flag == 0)//如果经过一趟的排序,没有任何一个数组的值交换,那么表明数组中已经有序{break;}}}void SelectSort(int* arr,int size){int i = 0;int j = 0;int min = 0;int tmp = 0;assert(arr);for (i = 0;i < size;i++){min = i;for (j = i+1;j < size;j++){if (arr[min] > arr[j]){min = j;//记住当前最小值的下标值}}tmp = arr[min];//找出最小的值,下标从0开始交换arr[min] = arr[i];arr[i] = tmp;}}void InsertSort(int* arr,int size){int i = 0;int j = 0;int tmp = 0;assert(arr);for (i = 1;i < size;i++)//i=1认为只有一个数字是有序的{if(arr[i-1] > arr[i]){tmp = arr[i];  //保存当前需要排序的值for (j = i; j>0 && arr[j-1] > tmp;j--){arr[j] = arr[j-1];}arr[j] = tmp;}}}void PrintSort(int* arr,int size){int i = 0;assert(arr);for (i = 0;i < size;i++){printf("%d ",arr[i]);}printf("\n");}</span>


 

0 0
原创粉丝点击