冒泡排序,每次只排一个,像鱼吐泡泡一样,从数组最后开始两两交换,一次只找到一个当前最小的,放到第一个,第二个...位置.
T(n)=O(n的平方),有序O(n)
S(n)=O(1)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef int ElemType;
typedef struct {ElemType * elem;//存,申请的空间的首地址int tab_length;//存储动态数组里元素的个数
}SSTable;
void ST_Init(SSTable &t,int len) {t.tab_length=len;//元素个数,数组长度t.elem = (ElemType *) malloc(sizeof(ElemType)*t.tab_length);int i;srand(time(NULL));//随机数for (i = 0; i < t.tab_length; i++){t.elem[i] = rand() % 100;//0~99}
}
void Print(SSTable s)
{int i;for ( i = 0; i <s.tab_length ; ++i) {printf("%3d",s.elem[i]);}printf("\n");
}
void swap(ElemType &a,ElemType &b)
{int temp=a;a=b;b=temp;
}
void Bobble(SSTable &t)
{int i,j;bool flag= false;for ( i = 0; i <t.tab_length ; i++)//排好了几个{for ( j = t.tab_length-1; j >i; j--){if(t.elem[j]<t.elem[j-1]){swap(t.elem[j],t.elem[j-1]);flag= true;//冒泡从后往前先find最小的,如果在j=1时都没有发生交换的都没有找到,说明有序}}if (false==flag){return;//本身有序}}
}
int main() {SSTable t;int len=10;//数组长度ST_Init(t,len);Print(t);Bobble(t);Print(t);free(t.elem);return 0;
}
快速排序:这里我采用的是覆盖,所以要记得最后还原分割点元素
t(n)=O(nlogn),如果本身有序O(n)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef int ElemType;
typedef struct {ElemType * elem;//存,申请的空间的首地址int tab_length;//存储动态数组里元素的个数
}SSTable;
void ST_Init(SSTable &t,int len) {t.tab_length=len;//元素个数,数组长度t.elem = (ElemType *) malloc(sizeof(ElemType)*t.tab_length);int i;srand(time(NULL));//随机数for (i = 0; i < t.tab_length; i++){t.elem[i] = rand() % 100;//0~99}
}
void Print(SSTable s)
{int i;for ( i = 0; i <s.tab_length ; ++i) {printf("%3d",s.elem[i]);}printf("\n");
}
void swap(ElemType &a,ElemType &b)
{int temp=a;a=b;b=temp;
}
int partition(ElemType *a,int low,int high)
{int pivot=a[low];while (low<high) {while ( low<high&&pivot<=a[high]){high--;}a[low]=a[high];while ( low<high&&pivot>=a[low]){low++;}a[high]=a[low];}a[low]=pivot;return low;
}
void Quick_sort(SSTable &s,int low,int high)
{if(low<high){int pivot= partition(s.elem, low, high);//保存分割点Quick_sort(s, low, pivot-1);
// Print(s);Quick_sort(s, pivot+1, high);}}
int main() {SSTable t;int len=10,low=0,high=len-1;//数组长度,,index最大len-1ST_Init(t,len);Print(t);Quick_sort(t,low,high);Print(t);free(t.elem);return 0;
}
如果没看懂边界条件可以看看这个图,因为最后一定是两个值之间的排序~
插入排序
T(n)=O(n的平方),如果本身有序O(n)
第一个是放好的,有序,从第二个开始依次往里面插入,每插入一个都排一次序
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
typedef int ElemType;
typedef struct {ElemType * elem;//存,申请的空间的首地址 8bit,指针int tab_length;//存储动态数组里元素的个数
}SSTable;
void ST_Init(SSTable &t,int len) {t.tab_length=len;//元素个数,数组长度t.elem = (ElemType *) malloc(sizeof(ElemType)*t.tab_length);int i;srand(time(NULL));//随机数for (i = 0; i < t.tab_length; i++){t.elem[i] = rand() % 100;//0~99}}
void Print(SSTable s)
{int i;for ( i = 0; i <s.tab_length ; ++i) {printf("%3d",s.elem[i]);}printf("\n");
}
void swap(ElemType &a,ElemType &b)
{int temp=a;a=b;b=temp;
}
//第一个有序,倒着插入
void insert(SSTable &s)
{int i,j,temp_val;for ( i = 1; i <s.tab_length ; i++) {//外层控制插入的数,表示已经排了几个temp_val=s.elem[i];//保存当前比较的值,因为换位置后,原先的位置上的值替换掉了,比较的内容会变for ( j =i-1 ; j>=0&&s.elem[j]>temp_val; j--) {swap(s.elem[j],s.elem[j+1]);}}}
int main() {SSTable t;int len=10,low=0,high=len-1;//数组长度,,index最大len-1ST_Init(t,len);
// ElemType a[10]={40,86,71,33,77,59,61,86,71,35};
// memcpy(t.elem,a,sizeof(a));//copy整型或者浮点型数组用这个//printf("%d\n",sizeof(a)); //a长度为4bit*10Print(t);insert(t);Print(t);free(t.elem);return 0;
}