1.选择排序和冒泡排序
时间复杂度:O()
我想讲一下,程序员写这种排序的时候名字都是尽量取的让人能通俗易懂一些的,比如选择,就是每次都拿首个数去和其他的数比嘛。但是,往往这种排序在时间复杂度上都是非常冗余的。还有就是冒泡排序了,顾名思义嘛,让数列像泡泡一样冒出来啦啦啦,两两对比。
//选择排序
for(int i=0;i<n;i++){
for(int j=i;j<n;j++){
if(a[j]<a[i]){
s =a[j];
a[j]=a[i];
a[i] =s;
}
}
}
for(int i = n;i>0;i--){
for(int j =i;j>=0;j--){
if(a[j]<a[j-1]){
s = a[j];
a[j] = a[j-1];
a[j-1]=s;
}
}
}
//以上是冒泡排序的基本逻辑
2.插入排序
时间复杂度O(n)
首先这里实现插入排序的时候是用一个链表来实现的,然后也巧妙的使用了一个叫哨兵的鬼玩意儿,当然我觉得可以用别的东西来代替的,比如定义一个int s啊之类的,插入也就是表面意思,在原有已经排好的基础上再插入就行,接下来就直接上代码喽
for(int i=1;i<l.length;i++){
if(l.data[i]<l.data[i-1]){
int s =l.data[i];
//只有在后面一个比前面小的情况下才需要插入排序
for(int j=i;s<l.data[j-1];j--){
l.data[j+1] =l.data[j];
}
l.data[j]=s;
}
}
3.堆排
堆排其实就是类似于二叉树的排序,首先在脑中建立起一个二叉树,对要传入的数据进行筛查,把最大的往前送,并且使得每一个根节点下的子树又是一个“大头树”。当使得二叉树的根节点a[0]是最大数时,然后和最后一个结点交换,依次类推。
void stack_sort(int str[],int n){
int father = n/2;
int son = father * 2+1;
while(son<n){
if(str[son]<str[son+1]){
son++;
}
if(str[son]>str[father]){
swap(str[son],str[father])
//这个函数就是交换他俩数据用的哦
father = son;
son = father *2+1;
}
}
}
void main_sort(int str[],int n){
for(int i=0;i<n;i++){
stack_sort(str,n);
}
swap(str[0],str[n-1])
}
4.快排
快速排序奥,是工作中经常用到的,基本的用法就是三数排序
(1)先找数组的头个然后往后判断,看他是不是最小的,如果是最小的话,那就直接跳过他,往后继续快排
(2)每次都得记录一下
void quick_sort(int str[],int low,int high){
swap = str[low];
while(low<high && str[low]<=str[high]){
high--;
}
if(low < high){
str[low]=str[high];
}
while(low<high && str[high]<=){
low++;
}
if(low < high){
str[high] = str[low];
}
str[low]=str[high];
return low;
}
void quick_sort(int str[],int a,int b){
while(a<b){
int location=get_location(str,a,b);
quick_sort(str,location+1,b);
quick_sort(str,a,location-1);
}
}
5.归并排序
归并排序,我觉得真的很智障,我???当时看了一个博主写的归并,我直接在云雾弥漫的天际遨游了好几天,我真的很沉醉,明明只用一个数组+一个临时数字解决的问题,他非得3个数组之间来回递归,我真的会shit。
void merge(int str[],int a,int b,int mid){
int left_start=a;
int right_start=mid+1;
int tem[20];
int k=0
while(left_start<mid && right_start<b){
if(str[left_start]<str[right_start]){
tem[k++]=str[left_start];
}else{
tem[k++]=str[right_start];
}
}
while(left_start<mid){
tem[k++]=str[left_start];
}
while(right_start<b){
tem[k++]=str[right_start];
}
}
void conbination_sort(int str[],int a,int b){
if(a ==b ){
return;
}
else{
int mid = (a+b-1)/2
conbination_sort(str,a,mid-1);
conbination_sort(str,mid+1,b);
merge(str,a,b,mid);
}
}
6.希尔排序
啦啦啦,希尔排序,也不知道又是谁想出来这种方法的,总之用到现在,终于知道为啥快排那么好用了呢。闲话不多说直接上代码咯
void xier_sort(int a[],int len){
int j,i,k,swap
for(j = len/2;j>=1;j=j/2){
for(i=len+1;i<=len;i++){
if(a[i]<a[i-len]){
swap = a[i];
for(k=i-len;a[k]>a[k+len] && k>=0;k-=j)
a[k+len] =a[k];
}
a[k+len]=swap;
}
}
}
结束了自己罪孽的一生