机缘
五味陈杂,这个月没咋写代码做项目,考研也应该是废了,准备把天赋带到考公和工作上,最近打算准备一下毕设和整理以前的课设。晚上玩完游戏练习了几个常用的基础排序算法,不知道以后的工作是否还能用上这些。
头文件
extern void InsertSort(int a[], int n);//插入排序
extern void ShellSort(int a[],int n);//希尔排序
extern void QuickSort(int a[],int low,int high);//快速排序
extern void BubbleSort(int a[],int n);//冒泡排序
extern void BubbleSort_c(int a[],int n);//双向交替冒泡排序
代码
void InsertSort(int a[], int n){
int i,j=0;
int temp=0;
for(i=1;i<n;i++){
if(a[i]<a[i-1]) {//判断是否需要排序
temp = a[i];//临时储存当前要排序的数
for (j = i - 1; (a[j]>temp)&&(j>=0); j--) {//如果不限定j>=0会在第一位需要挪动时产生错误
a[j + 1] = a[j];//从后往前向后挪1位,直到找到比要排序的数要小的数
}
a[j + 1] = temp;//把要插入的数放在比这个数小的数后面
}
}
}
void ShellSort(int a[],int n){
int j=0;
for(int dk=n/2;dk>=1;dk=dk/2)//控制步长变化
for(int i=dk;i<n;i++)//从下标dk遍历到下标n-1
if(a[i]<a[i-dk]){//看这个元素是否需要和子表中上一个元素交换顺序,此元素比上一个元素小则需要把这个元素
int temp=a[i];//temp暂存需要重排序的元素
for(j=i-dk;j>=0&&temp<a[j];j-=dk)//把比temp小的子表元素在子表中后移
a[j+dk]=a[j];//j+dk就是i
a[j+dk]=temp;//for中最后j-=dk,实际上此时temp值的位置在此时j+dk
}
}
int Partition(int a[],int low,int high){//控制low和high两个下标,交替搜索比轴大的或比轴小的,比轴小的移动到low处,比轴大的移动到high处
int pivot = a[low];//把当前表的第一个元素的值作为轴,这个轴会最终在low和high相等处出现
while(low<high){//只有一个元素的时候就不执行了,即low==high时
while(low<high&&a[high]>=pivot) high--;//用high从后往前搜索直到找到比轴小的,相等不动
a[low]=a[high];//将那个比轴小的数放到low的那个位置去,相当于后移(局部不讲顺序)
while(low<high&&a[high]<=pivot) low++;//用low从前往后搜索直到找到比轴大的,相等不动
a[high]=a[low];//将那个比轴大的数放到high的那个位置去,相当于前移
}
a[low]=pivot;//low==high处是轴的位置
return low;//返回轴的下标,完成了数组的划分,轴前面都是比轴小的,轴后面都是比轴大的
}
void QuickSort(int a[],int low,int high){
if(low<high){//超过一个元素才有排序的必要,即最小子表只剩一个元素时局部排序完成,总体排序也完成
int pivot = Partition(a,low,high);//对表进行划分
QuickSort(a,low,pivot-1);//分别对两个子表进行排序,这是分治的思想
QuickSort(a,pivot+1,high);
}
}
void swap(int *a,int *b){//注意此处如果不是传入地址将无法进行实质上的交换
int temp=*a;
*a=*b;
*b=temp;
}
void BubbleSort(int a[],int n){
bool flag = false;//记录某一趟有没有发生交换
for(int i=0;i<=n-1;i++){//冒泡排序从0干到n-1,一共n趟,每一趟把最大的元素放到最后
flag = false;
for(int j=0;j<=n-2-i;j++){//每一趟从前往后进行比较,不断交换把大的元素往后推,最大的元素会推到最后确定顺序
if(a[j]>a[j+1]){//最后一位是n-1-i
swap(&a[j],&a[j+1]);
flag=true;
}
}
if(flag == false) return;//如果某一趟没有发生交换则提前有序
}
}
void BubbleSort_c(int a[],int n){//双向冒泡排序
bool flag = false;//记录某一趟有没有发生交换
int c=0;
for(int i=0;i<=n-1;i++) {//冒泡排序从0干到n-1,一共n趟,每一趟把最大的元素放到最后
flag = false;
for (int j = 0; j <= n - 2 - i; j ++) {//奇数趟从前往后进行比较,不断交换把大的元素往后推,最大的元素会推到最后确定顺序
if (a[j] > a[j + 1]) {//最后一位是n-1-i
swap(&a[j], &a[j + 1]);
flag = true;
}
}
for (int j = n - 1 - i; j >= 1; j --) {//偶数趟每一趟从后往前进行比较,不断交换把小的元素往后推,最小的元素会推到最前边确定顺序
if (a[j] < a[j - 1]) {//只要元素比前一个元素小就交换两元素位置
swap(&a[j], &a[j - 1]);
flag = true;
}
}
if (flag == false) return;//如果某两趟没有发生交换则提前有序
}
}//双向冒泡排序
憧憬
继续练习吧,又站在人生的转折点了,以后想多研究计算机视觉和嵌入式方向,可能以后工作并不对口,但是希望以后最少能以爱好继续学下去。