常见排序算法(基于C语言的算法设计)
所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。一个优秀的算法可以节省大量的资源。在各个领域中考虑到数据的各种限制和规范,要得到一个符合实际的优秀算法,得经过大量的推理和分析。
冒泡排序算法
//冒泡排序时间复杂度O(n^2)
#include<stdio.h>
void main()
{
int n[10] = { 25,35,68,79,21,13,98,7,16,62 };//定义一个大小为10的数组
int i, j, temp;
for (i = 1; i <= 9; i++)//外层循环是比较的轮数,数组内有10个数,那么就应该比较10-1=9轮
{
for (j = 0; j <= 9 - i; j++)//内层循环比较的是当前一轮的比较次数,例如:第一轮比较9-1=8次,第二轮比较9-2=7次
{
if (n[j] > n[j + 1])//相邻两个数如果逆序,则交换位置
{
temp = n[j];
n[j] = n[j + 1];
n[j + 1] = temp;
}
}
}
printf("排序过后的数顺序:\n");
for (i = 0; i < 10; i++)
printf("%-4d", n[i]);
printf("\n");
}
选择排序
//时间复杂度O(n^2)
#include <stdio.h>
void arr_out(int a[8])//输出函数
{
int i = 0;
for(i = 0;i < 8;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
void arr_sort(int *p,int n)
{
int i,j;
int min = 0;
for(i = 0;i < n - 1;i++)//排序次数
{
min = i;
for(j = i + 1;j < n;j++)
{
if(p[j] < p[min])
{
min = j;//记录交换的元素下标值
}
}
if(i != min)
{
int temp = p[i];
p[i] = p[min];
p[min] = temp;
}
}
}
int main()
{
int a[8] = {0};
int i = 0;
for(i = 0;i < 8;i++)
{
scanf("%d",&a[i]);
}
arr_sort(a,8);//排序函数
arr_out(a);//输出函数
return 0;
}
插入排序
//时间复杂度O(n^2)
#include <stdio.h>
#define n 10
int main()
{
int a[n],i,j,k,x;
scanf("%d",&a[0]);//读入第一个数,直接存到a[0]中
for(j=1;j<n;j++)//将第二个至第10个数一一有序插入到数组a中
{
scanf("%d",&x);
if(x<a[j-1])
a[j]=x;//比最后一个数还小就往最后一个元素之后存放新读的数
else//以下查找待查位置(从头开始查)
{
i=0;
while(x<a[i]&&i<=j-1)//条件判断,并且不超范围
{
i++;
}
for(k=j-1;k>=i;k--)//(包括i)的项到最后一项(k=j-1)后移一位
{
a[k+1]=a[k];//后等前,后移
}
a[i]=x;//插入待插入数
}
}
for(i=0;i<n;i++)
{
printf("%d\n",a[i]);
}
return 0;
}
归并排序
#include <stdio.h>
#include <stdlib.h>
void Merge(int A[],int left,int mid,int right){
int B[1024]={0};
int i=left;
int j=mid+1;
int k=0;
while(i<=mid&&j<=right){
if(A[i]<A[j]){
B[k++]=A[i++];
}else{
B[k++]=A[j++];
}
}
if(i==mid+1){
while(j<=right){
B[k++]=A[j++];
}
}
if(j==right+1){
while(i<=mid){
B[k++]=A[j++];
}
}
for(i=left,j=0;j<k;i++,j++){
A[i]= B[j];
}
}
void MergeSort(int A[],int left,int right){
if(left>=right){
return ;
}
int mid = (left+right)/2;
MergeSort(A,left,mid);
MergeSort(A,mid+1,right);
Merge(A,left,mid,right);
}
void outPut(int A[],int right){
for(int i=0;i<right;i++){
printf("%d\n",A[i]);
}
}
int main()
{
int A[]={7,8,2,10};
int n = sizeof(A)/sizeof(A[0]);
MergeSort(A,0,n-1);
outPut(A,n);
return 0;
}
快速排序
在这里插入代码片
void Quick_Sort(int *arr, int begin, int end){
if(begin > end)
return;
int tmp = arr[begin];
int i = begin;
int j = end;
while(i != j){
while(arr[j] >= tmp && j > i)
j--;
while(arr[i] <= tmp && j > i)
i++;
if(j > i){
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
arr[begin] = arr[i];
arr[i] = tmp;
Quick_Sort(arr, begin, i-1);
Quick_Sort(arr, i+1, end);
}