C语言实现各种排序算法
- 冒泡排序
- 选择排序
- 插入排序
- 希尔排序(插入方式)(非交换方式)
- 快速排序
- 归并排序(分治思想)
- 基数排序(桶排序)
冒泡排序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void bubbleSorting(int *arr,int arrLength){
for (int i = 0; i < arrLength; ++i) {
for (int j = 0; j < arrLength-i-1; ++j) {
if(arr[j]>arr[j+1]){
int temp = arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
}
}
}
}
int main(){
int arr[]={3,9,-1,10,20};
int length = sizeof(arr)/sizeof(int);
printf("%d\n",length);
bubbleSorting(arr,length);
for (int i = 0; i < length; ++i) {
printf("%d ",arr[i]);
}
return 0;
}
选择排序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void selectedSorting(int* arr,int length){
for (int i = 0; i < length; ++i) {
int minNum = INT_MAX;
int index = 0;
for (int j = i; j < length; ++j) {
if(arr[j]<minNum){
minNum=arr[j];
index = j;
}
}
arr[index]=arr[i];
arr[i]=minNum;
}
}
int main() {
int arr[]={8,3,2,1,7,4,6,5};
selectedSorting(arr, sizeof(arr)/ sizeof(int));
for (int i = 0; i < sizeof(arr)/ sizeof(int); ++i) {
printf("%d ",arr[i]);
}
return 0;
}
插入排序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void insertionSorting(int* arr,int length){
for (int i = 1; i < length; ++i) {
int currentNum = arr[i];
int currentIndex = i;
while (currentNum<arr[currentIndex-1] && currentIndex>=0){
arr[currentIndex]=arr[currentIndex-1];
currentIndex--;
}
arr[currentIndex]=currentNum;
}
}
int main() {
int arr[]={8,3,2,1,7,4,6,5};
insertionSorting(arr, sizeof(arr)/ sizeof(int));
for (int i = 0; i < sizeof(arr)/ sizeof(int); ++i) {
printf("%d ",arr[i]);
}
printf("hello,world!");
return 0;
}
希尔排序(插入方式)(非交换方式)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void shellSorting(int* arr,int length){
for (int gap = length/2; gap >=1 ; gap=gap/2) {
for (int i = 0; i < length; i=i+gap) {
int currentNum = arr[i];
int currentIndex = i;
while (currentNum<arr[currentIndex-gap] && currentIndex>=0){
arr[currentIndex]=arr[currentIndex-gap];
currentIndex=currentIndex-gap;
}
arr[currentIndex]=currentNum;
}
}
}
int main() {
int arr[]={8,3,2,1,7,4,6,5};
shellSorting(arr, sizeof(arr)/ sizeof(int));
for (int i = 0; i < sizeof(arr)/ sizeof(int); ++i) {
printf("%d ",arr[i]);
}
printf("hello,world!");
return 0;
}
快速排序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void quickSorting(int *arr,int left,int right){
int l = left;
int r = right;
int pivot = arr[(right+left)/2];
int temp = 0;
while (l<r){
while (arr[l]<pivot){
l+=1;
}
while (arr[r]>pivot){
r-=1;
}
if(l>=r){
break;
}
temp=arr[l];
arr[l]=arr[r];
arr[r]=temp;
if(arr[l]==pivot){
r-=1;
}
if(arr[r]==pivot){
l+=1;
}
}
if(l==r){
l+=1;
r-=1;
}
if(left<r){
quickSorting(arr,left,r);
}
if(right>l){
quickSorting(arr,l,right);
}
}
int main() {
int arr[]={8,3,2,1,7,4,6,5};
quickSorting(arr, 0,(sizeof(arr)/ sizeof(int))-1);
for (int i = 0; i < sizeof(arr)/ sizeof(int); ++i) {
printf("%d ",arr[i]);
}
printf("hello,world!");
return 0;
}
归并排序(分治思想)


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void merge(int* arr,int left,int mid,int right,int *temp){
int i = left;
int j = mid+1;
int t = 0;
while (i<=mid && j<=right){
if(arr[i]<=arr[j]){
temp[t]=arr[i];
t+=1;
i+=1;
}else{
temp[t]=arr[j];
t+=1;
j+=1;
}
}
while (i<=mid){
temp[t]=arr[i];
t+=1;
i+=1;
}
while (j<=right){
temp[t]=arr[j];
t+=1;
j+=1;
}
t=0;
int tempLeft =left;
while (tempLeft<=right){
arr[tempLeft]=temp[t];
t+=1;
tempLeft+=1;
}
}
void mergeSorting(int* arr,int left,int right,int *temp){
if(left<right){
int mid = (left+right)/2;
mergeSorting(arr,left,mid,temp);
mergeSorting(arr,mid+1,right,temp);
merge(arr,left,mid,right,temp);
}
}
int main() {
int arr[]={8,3,2,1,7,4,6,5};
int temp[sizeof(arr)/ sizeof(int)]={};
mergeSorting(arr, 0,sizeof(arr)/ sizeof(int),temp);
for (int i = 0; i < sizeof(arr)/ sizeof(int); ++i) {
printf("%d ",arr[i]);
}
printf("hello,world!");
return 0;
}
基数排序(桶排序)

基数排序的基本思想(典型的空间换时间方式):
将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成后,数列就变成了一个有序序列。



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void radixSorting(int *arr, int length) {
char strTemp[] = " ";
int max = arr[0];
for (int i = 0; i < length; ++i) {
if (arr[i] >= max) {
max = arr[i];
}
}
sprintf(strTemp,"%d",max);
int maxLength = strlen(strTemp);
int bucket[10][length];
int bucketElementCounts[10]={};
for (int i = 0,n=1; i < maxLength; ++i,n*=10) {
for (int j = 0; j < length; ++j) {
int digitOfElement = arr[j]/n%10;
bucket[digitOfElement][bucketElementCounts[digitOfElement]]=arr[j];
bucketElementCounts[digitOfElement]++;
}
int index =0;
for (int k = 0; k < sizeof(bucketElementCounts)/ sizeof(int); ++k) {
if(bucketElementCounts[k]!=0){
for (int l = 0; l < bucketElementCounts[k]; ++l) {
arr[index++]=bucket[k][l];
}
}
bucketElementCounts[k]=0;
}
}
}
int main() {
int arr[] = {53, 3, 542, 748, 14, 214};
radixSorting(arr, sizeof(arr)/ sizeof(int));
for (int i = 0; i < sizeof(arr)/ sizeof(int); ++i) {
printf("%d ",arr[i]);
}
return 0;
}

速度较快,但是遇到超大数量级的就不行了。空间不足,容易造成内存溢出。