冒泡排序:两两对比交换

cs
//该写法错误,应该把length放在Main方法
void bubble(int arr[]){
//数组参数传入的是指针
int length = sizeof(arr)/sizeof(int); //此时length=2;
for(int j=0;j<length;j++){
for(int i=0;i<length;i++){
if(arr[i]>arr[i+1]){
int temp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=temp;
}
}
}
for(int i=0;i<length;i++){
printf("%d ",arr[i]);
}
}
简单选择排序:每一轮从待排序的元素中选出最小(或最大)的一个元素,将其放在已排序序列的末尾,直到全部元素排序完成。

cs
void simple(int arr[],int length){
for(int i=0;i<length;i++){
int minIndex=i; //记录最小值的位置
for(int j=i+1;j<length;j++){
if(arr[minIndex]>arr[j]){
minIndex=j;
}
}
//下标i的位置与最小值的位置进行交换
int temp=arr[i];
arr[i]=arr[minIndex];
arr[minIndex]=temp;
}
}
//主方法
int main(){
int arr[]={3,4,23,8,6,9,19};
int length=sizeof(arr)/sizeof(int);
simple(arr,length);
for(int i=0;i<length;i++){
printf("%d ",arr[i]);
}
}
插入排序:将待排序的元素逐个插入到已排序序列的合适位置

cs
//插入排序
void insert(int arr[],int length){
for(int i=1;i<length;i++){
for(int j=i-1;j>=0;j--){
if(arr[j+1]<arr[j]){
int temp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
}
}
}
}
//主方法
int main(){
int arr[]={3,4,23,8,6,9,19};
int length=sizeof(arr)/sizeof(int);
insert(arr,length);
for(int i=0;i<length;i++){
printf("%d ",arr[i]);
}
}
希尔排序:将整个数组按照某个增量(gap)分组,对每组进行直接插入排序,然后逐步减小增量,直到增量为1时进行最后一次排序,最终使整个数组完全有序。
cs
//希尔排序
void insert(int arr[],int length){
for(int h=length/2;h>=1;h/=2){
for(int i=h;i<length;i++){
for(int j=i-h;j>=0;j-=h){
if(arr[j]>arr[j+h]){
int temp=arr[j];
arr[j]=arr[j+h];
arr[j+h]=temp;
}
}
}
}
}
快速排序:通过一趟排序将待排序列分成独立的两部分,其中一部分的所有元素都比另一部分的所有元素小,然后再分别对这两部分进行排序,以达到整个序列有序。
(关于递归)--变量直接作为参数

cs
void sort(int arr[],int left,int right,int i,int j){
if(left>=right){
return;
}
int base=arr[left];
i=left;
j=right;
while(i!=j){
while(arr[j]>=base && i<j){
j--;
}
while(arr[i]<=base && i<j){
i++;
}
int temp=arr[i];
arr[i]=arr[j];
arr[left]=temp;
}
arr[left]=arr[i];
arr[i]=base;
sort(arr,left,i-1,i,j);
sort(arr,i+1,right,i,j);
}
归并排序:将待排序序列分成两个子序列,分别对子序列进行排序,然后将已排序的子序列合并成一个完整的有序序列。