冒泡排序法
原理:
依次比较相邻的两个元素,如果顺序错误就交换。
思路:
这种方法,显然需要很多轮才能完成,每一轮只能排序一个最大值或最小值(第一层for),将全部的数据排序完成,需要很多轮(第二层for)。
对于第一层for,就是遍历数组,然后比较大小,进行交换。有两个注意点:
- 效率:第一次排序完成之后,末尾就已经是最值了,下一次可以不再比较末尾这个数字。
- 越界:比如数组大小为5,要比较的实际是a[i]与a[i+1],因此i+1要小于5,不能越界
对于第二层for,就是考虑需要比较多少次。有两个注意点:
- 次数:有5个数,找出4个最值就可以进行排序了,而不是需要找5次。
- 效率:当第一层for没有进行排序时,代表这个数组已经排序好了,这时可以直接break。
代码接口说明如下:
1、void BubbleSortArray(char* array,int size,char mode);
功能:使用冒泡排序法进行排序
array:数组首地址
size:数组大小
mode:排序模式,' U '代表升序排序,' D '代表降序排序
2、void Print_Array(char* array,int size)
打印调试代码
具体代码实现如下:
#include <stdio.h>
void BubbleSortArray(char* array,int size,char mode){
int i,j;
char SortFinishFlag = 1;
if(array == NULL){
printf("err:array is NULL\n");
return;
}
//1.找到size-1个最大/小值,即可进行排序
for(j=0;j<size-1;j++){
//2.比到上一个排到的末尾即可
for(i=0;i<size-1-j;i++){
switch(mode){
case 'U'://升序排序,小数在低位
if(array[i]>array[i+1]){
array[i] = array[i]^array[i+1];
array[i+1] = array[i]^array[i+1];
array[i] = array[i]^array[i+1];
SortFinishFlag = 0;
}
break;
case 'D'://降序排序,大数在低位
if(array[i]<array[i+1]){
array[i] = array[i]^array[i+1];
array[i+1] = array[i]^array[i+1];
array[i] = array[i]^array[i+1];
SortFinishFlag = 0;
}
break;
default:
printf("mode err\n");
return;
}
}
printf("Debug:MaxLoopNum = %d,NowLoopNum = %d\n",size-1,j);
//数据无交换,提前退出
if(1 == SortFinishFlag){
break;
}else{
SortFinishFlag = 1;
}
}
}
/* 打印数组 */
void Print_Array(char* array,int size){
int i;
for(i=0;i<size;i++){
printf("%d ",array[i]);
}
}
int main(){
char a[]={1,2,3,4,5};
BubbleSortArray(a,sizeof(a)/sizeof(char),'U');
Print_Array(a,sizeof(a)/sizeof(char));
return 0;
}
简单排序法
原理:
始终用未排序的第一个进行比较,依次与后面的值进行比较,如果顺序错误就交换。
代码接口说明如下:
1、void SimpleSelectSortArray(char* array,int size,char mode);
功能:使用冒泡排序法进行排序
array:数组首地址
size:数组大小
mode:排序模式,' U '代表升序排序,' D '代表降序排序
2、void Print_Array(char* array,int size)
打印调试代码
具体代码实现如下:
#include <stdio.h>
void SimpleSelectSortArray(char* array,int size,char mode){
int i,j;
char SortFinishFlag = 1;
if(array == NULL){
printf("err:array is NULL\n");
return;
}
for(i=0;i<size-1;i++){
for(j=i+1;j<size;j++){
switch(mode){
case 'U'://升序,小数放低位
if(array[i]>array[j]){
array[i] = array[i] ^ array[j];
array[j] = array[i] ^ array[j];
array[i] = array[i] ^ array[j];
SortFinishFlag = 0;
}
break;
case 'D'://降序,大数放低位
if(array[i]<array[j]){
array[i] = array[i] ^ array[j];
array[j] = array[i] ^ array[j];
array[i] = array[i] ^ array[j];
SortFinishFlag = 0;
}
break;
default:
printf("mode err");
}
}
printf("Debug:MaxLoopNum = %d,NowLoopNum = %d\n",size-1,i);
//数据无交换,提前退出
if(1 == SortFinishFlag){
break;
}else{
SortFinishFlag = 1;
}
}
}
/* 打印数组 */
void Print_Array(char* array,int size){
int i;
for(i=0;i<size;i++){
printf("%d ",array[i]);
}
}
int main(){
char a[]={1,2,3,4,5,6,7,8,9};
SimpleSelectSortArray(a,sizeof(a)/sizeof(char),'U');
Print_Array(a,sizeof(a)/sizeof(char));
return 0;
}
库函数qsort法
qsort
是C语言标准库中的快速排序函数,定义在 stdlib.h
头文件中。它是一种高效的排序算法,使用分治法(Divide and Conquer)策略来对数组或序列进行排序。
qsort函数声明:
/* qsort函数声明 */
void qsort(void *base,
size_t num,
size_t size,
int (*compar)(const void *, const void *)
);
base:需要进行排序的数组首地址
num:需要进行排序的元素数量,填入数组的大小
size:数组中每个元素的大小(以字节为单位),用sizeof取值填入
compar:比较函数指针,用于决定升序、降序排列
qsort代码编写步骤:
- 编写比较函数MyNumCompare,可以参考示例代码,不进行修改
- 定义一个变量Asize,保存数组的大小
- 调用qsort进行排序
qsort示例代码如下:
#include <stdio.h>
#include <stdlib.h>
//比较函数
int MyNumCompare(const void *a, const void *b){
int int_a = *(const int*)a;
int int_b = *(const int*)b;
/* 升序排列 */
return int_a-int_b;
/* 降序排列 */
//return int_b-int_a;
}
//打印数组
void Print_Array(int* array,int size){
int i;
for(i=0;i<size;i++){
printf("%d ",array[i]);
}
}
int main(){
int a[]={1,2,3,4,5};
int Asize = sizeof(a)/sizeof(int);//求出数组大小
//排序
qsort(a,Asize,sizeof(a[0]),MyNumCompare);
//打印排序后的结果
Print_Array(a,Asize);
return 0;
}
快速排序
具体代码实现如下:
#include "sort.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/*
* quick_sort:快速排序
* */
void quick_sort(data_t* data,int size){
data_t refer = data[0];
int pLow = 0;
int pHigh = size - 1;
int dir = 'H';//H代表从右开始比较,L代表从左开始比较
int left_size = 0;
int right_size = 0;
//递归退出条件
if(pHigh <= pLow){
return;
}
//开始快排
while(1){
if(pHigh <= pLow){
break;
}
//选择比较方向
switch(dir){
//低位比较,参考值在高位
case 'L':
//低位比参考值大,交换位置,并交换比较方向
if(data[pLow] > refer){
data[pHigh] = data[pLow];
data[pLow] = refer;
pHigh--;
right_size++;
dir = 'H';
}else{
pLow++;
left_size++;
}
break;
//高位比较,参考值在低位
case 'H':
//高位比参考值小,交换位置,并交换比较方向
if(data[pHigh] < refer){
data[pLow] = data[pHigh];
data[pHigh] = refer;
pLow++;
left_size++;
dir = 'L';
}else{
pHigh--;
right_size++;
}
break;
}
}
quick_sort(data+0,left_size);//左边快排
quick_sort(data+left_size+1,right_size);//右边快排
}