废话不说,直接上代码
1.冒泡排序
#include<stdio.h>
#define LEN sizeof(arr)/sizeof(arr[0])//这里容易出现问题,数组做参数 LEN 可能为1
void swap(int *p, int *q)
{
int temp = *p;
*p = *q;
*q = temp;
}
void bubble_sort(int arr[])//数组作参数时,可以看作指针(arr[] <=> *arr)
{
int i,j;
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
if(arr[j]>arr[j+1])
{
swap(&arr[j], &arr[j+1]);
}
}
}
}
void main()
{
int arr[] = {3, 9, 2, 7, 10, 8, 4, 6, 5, 1};
int i;
bubble_sort(arr);
for(i=0;i<LEN;i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
2.选择排序(和冒泡差不多)
#include<stdio.h>
#define LEN sizeof(arr)/sizeof(arr[0])
void arr_print(int arr[], int len)
{
int i;
for (i=0;i<len;i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
void swap(int *p, int *q)
{
int temp = *p;
*p = *q;
*q = temp;
}
void select_sort(int *arr, int len)
{
int i, j, min_idx;
for(i=0;i<len;i++)
{
min_idx = i;
for(j=i;j<len;j++)
{
if(arr[j]<arr[min_idx])
{
min_idx = j;
}
}
swap(&arr[i], &arr[min_idx]);
}
}
void main()
{
int arr[] = {3, 9, 2, 7, 10, 8, 4, 6, 5, 1};
select_sort(arr, LEN);
arr_print(arr, LEN);
}
3.插入排序(这个编译没问题,思路是对的,就是不通过,不知为什么)
#include<stdio.h>
#define LEN sizeof(arr)/sizeof(arr[0])
void arr_print(int arr[], int len)
{
int i;
for (i=0;i<len;i++);
{
printf("%d ",arr[i]);
}
printf("\n");
}
void intsert_sort(int arr[])
{
int i;//有序当中的最后一个
int j;//无序当中的第一个
int temp;
for (j=1; j<10; j++)
{
temp = arr[j];
for(i=j-1; i>=0 && temp<arr[i]; i--)
{
arr[i+1] = arr[i];
}
arr[i+1] = temp;
}
}
void main()
{
int arr[] = {2, 9, 3, 7, 10, 8, 4, 6, 5, 1};
intsert_sort(arr);
arr_print(arr, LEN);
}
4.快速排序
#include<stdio.h>
#define LEN sizeof(arr)/sizeof(arr[0])
void arr_print(int arr[], int len)
{
int i;
for (i=0; i<len; i++)
printf("%d ", arr[i]);
printf("\n");
}
void quick_sort(int arr[], int len)
{
if (len == 0 || len == 1)
return ;
int l = 0;
int r = len-1;
int pivot_idx = len/2;
int pivot = arr[pivot_idx];
for (; l<r && arr[l]<pivot; l++)
;
for (; arr[r]>pivot && r>l; r--)
;
arr[pivot_idx] = arr[l];
while(l<r)
{
arr[l]=arr[r];
for (; arr[l]<pivot && l<r; l++)
;
arr[r]=arr[l];
for (; arr[r]>pivot && r>l; r--)
;
}
arr[l] = pivot;
quick_sort(arr, l);
quick_sort(arr+l+1, len-l-1);
}
void main()
{
int arr[] = {2, 10, 3, 5, 6, 9, 4, 7, 8, 1};
quick_sort(arr, LEN);
arr_print(arr, LEN);
}
5.shell 法
void shell_sort(int arr[])
{
int i, j, temp, x, step;
int steps[3] = {5, 3, 1};
for (x = 0; x < 3; x++)
{
step = steps[x];
for (j = 1; j < 10; j++)
{
temp = arr[j];
for (i = j-step;
i >= 0 && temp < arr[i];
i -= step)
{
arr[i+step] = arr[i];
}
arr[i+step] = temp;
}
}
}
6.
void merge_sort(int arr[], int len)
{
if (len == 0 || len == 1)
return ;
// left part of cur arr
merge_sort(arr, len/2);
// right part of cur arr
merge_sort(arr+len/2, len-len/2);
int temp[len];
int l = 0;
int r = len/2;
int i = 0;
while (l < len/2 && r < len)
{
if (arr[l] < arr[r])
temp[i++] = arr[l++];
else
temp[i++] = arr[r++];
}
while (l < len/2)
temp[i++] = arr[l++];
while (r < len)
temp[i++] = arr[r++];
for (i = 0; i < len; i++)
arr[i] = temp[i];
return ;
}