好久之前整理的了,再看一眼发出来。
目录
冒泡排序:
for(int i=0;i<n;i++){
for(int j=0;j<n-1-i;j++){
if(a[j]>a[j+1]){
int t=a[j];
a[j]=a[1+j];
a[j+1]=t;
}
}
}
快排:
冒泡的速度比较慢,如何提速这里就要用到快排,
代码如下:(从小到大排序)
void quicksort(int l,int r){
if(l>=r) return;
int i=l-1,j=r+1,x=a[(l+r+1)/2];//当然这里可以写成(l+r+1)>>1;
while(i<j){ //从大到小
do i++;while(a[i]<x);// a[i]>x;
do j--;while(a[j]>x);// a[j]<x;
if(i<j){
int t=a[i];
a[i]=a[j];
a[j]=t;
}
}
//digui
quicksort(l,i-1);
quicksort(i,r);
}
#include <stdio.h>
#include <stdlib.h>
int compare(const void*b1,const void *b2){
int num1=*(int*)b1;
int num2=*(int*)b2;
if(num1>num2) return 1;
else if(num1<num2) return -1;//其实1和-1在程序中都表示TRUE
else return 0; //只有0才表示FALSE;
}
int main(){
int t,a[100005];
scanf("%d",&t);
for(int i=0;i<t;i++){
scanf("%d",&a[i]);
}
qsort(a,t,sizeof(int),compare);//compare 就是一个规定这个数据怎么排列的函数
for(int i=0;i<t;i++){
printf("%d ",a[i]);
}
return 0;
}
归并排序:
说起这个,这两者的思想区别不是很大,但是快排他是一个不稳定的排序,
例如现在有一个 2 4 5 1 8 9 5 5 7 4 这样的数组要你排序,第二个“5”和第三个“5”的位置可在排序的过程发生互换,就可能出现:
1 2 4 4 5(1st) 5(3rd) 5(2nd) 7 8 9
1 2 4 4 5(3rd) 5(2nd)5(1st) 7 8 9
1 2 4 4 5(1st) 5(2nd) 5(3rd) 7 8 9
...
所以才有了归并排序:
代码如下:
void merge_sort(int l,int r){
if(l>=r) return;
int mid=(l+r)>>1;
merge_sort(l,mid);
merge_sort(mid+1,r);
int k=0,i=l,j=mid+1;
while(i<=mid&&j<=r){
if(a[i]<=a[j]) b[k++]=a[i++];
else {b[k++]=a[j++];}
}
while(j<=r) b[k++]=a[j++];
while(i<=mid) b[k++]=a[i++];
for(int i=0,j=l;j<=r&&i<k;i++,j++){
a[j]=b[i];
}
给个题:题目详情 - E.小U给你出道签到题 - 追梦算法网 (mangata.ltd)
这是我的死磕的记录,因为没初始化,所以一直是错的。