常用排序算法基本思想:
1.直接插入排序:是一种稳定的排序方法,其时间复杂度为O(n^2),空间复杂度为O(1),具体做法是:在插入第i个记录是,R1,R2,...,R(i-1)已经排好序,这时将Ri的关键字Ki依次与关键字K(i-1),K(i-2)等进行比较,从而找到应该插入的位置并将Ri插入,插入位置及其后的记录依次向后移动。
2.冒泡排序:
3.简单选择排序:是一种不稳定排序,(因为原数据为:4,6,3,4,1,其中第一次比较时,第一个4和最后一个1交换,这样两个4的前后位置变化了,是不稳定排序),其时间复杂度为O(n^2),空间复杂度为O(1),具体做法是:通过n-i(1<=i<=n)次关键字之间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录进行交换,当i等于n时所有记录有序排序。
4.希尔排序:
5.快速排序:
6.堆排序:
7.归并排序:
8.基数排序:
#include "stdio.h"
#include "malloc.h"
int *InitList(int *LineList, int n);
int *InsertData(int *LineList, int *n);
int *DelteData(int *LineList, int *n);
int FindData(int *LineList, int n);
//排序算法
int *BubbleSort(int *LineList, int n);
int *QuickSort(int *LineList, int low, int high);
int *SelectSort(int *LineList, int n);
int *InsertSort(int *LineList, int n);
int *ShellSort(int *LineList, int n);
int *HeapSort(int *LineList, int n);
void outputList(int *LineList, int n);
void menu(void);
int main()
{
int *LineList = NULL; //线性表
int *n; //线性表中*n个数据
int operateNum;
int Data;
//初始化线性表
n = (int *)malloc(sizeof(int));
printf("输入线性表中数据个数: ");
scanf("%d",n);
LineList = InitList(LineList, *n);
//线性表操作菜单
menu();
printf("输入相关操作:");
scanf("%d",&operateNum);
switch (operateNum)
{
case 1:
InsertData(LineList, n);
break;
case 2:
DelteData(LineList, n);
break;
case 3:
Data = FindData(LineList, *n);
printf("查找的数据为:%d\n",Data);
break;
case 4:
BubbleSort(LineList, *n);
break;
case 5:
QuickSort(LineList, 0, *n-1);//0为首地址坐标,*n-1为末尾地址坐标
break;
case 6:
SelectSort(LineList, *n);
break;
case 7:
InsertSort(LineList, *n);
break;
case 8:
ShellSort(LineList, *n);
break;
case 9:
HeapSort(LineList, *n);
break;
case 0:
break;
default:
printf("请输入[0,9]\n");
menu();
printf("输入相关操作:");
scanf("%d",&operateNum);
}
//输出线性表中数据
outputList(LineList, *n);
return 1;
}
//初始化线性表
int *InitList(int *LineList, int n)
{
LineList = (int *)malloc(n*sizeof(int));
for(int i = 0; i < n; i++)
{
printf("输入第 %d 个数据:",i+1);
scanf("%d", LineList+i);
}
return LineList;
}
//输出线性表中数据
void outputList(int *LineList, int n)
{
printf("最终线性表中数据为:\n");
for(int i = 0; i < n; i++)
{
printf("%d ",*(LineList+i));
if(0 == (i+1)%10)
{
printf("\n");
}
}
printf("\n");
}
//菜单
void menu()
{
printf("-------------选择相关操作--------------\n");
printf("***********插入数据请输入:1 **********\n");
printf("***********删除数据请输入:2 **********\n");
printf("***********查找数据请输入:3 **********\n");
printf("***********冒泡排序请输入:4 **********\n");
printf("***********快速排序请输入:5 **********\n");
printf("***********选择排序请输入:6 **********\n");
printf("***********插入排序请输入:7 **********\n");
printf("***********希尔排序请输入:8 **********\n");
printf("*********** 堆 排序请输入:9 **********\n");
printf("*********** 退出 请输入:0 **********\n");
printf("---------------------------------------\n");
}
//插入数据
int *InsertData(int *LineList, int *n)
{
int i, Data;
printf("请输入在第 i个位置插入的数据 Data: ");
scanf("%d,%d",&i,&Data);
if (i<1 || i>*n)
{
printf("请输入插入位置在[1,n]之间\n");
return 0;
}
*n = *n+1;
for(int k = *n; k >= i; k--)
{
*(LineList+k) = *(LineList+k-1);
}
*(LineList+i-1) = Data;
return LineList;
}
//删除数据
int *DelteData(int *LineList, int *n)
{
int i;
printf("请输入要删除第 i 个位置的数据:");
scanf("%d",&i);
if (i<1 || i>*n)
{
printf("请输入删除位置在[1,n]之间\n");
return 0;
}
for(int k = i-1; k < *n; k++)
{
*(LineList+k) = *(LineList+k+1);
}
*n = *n-1;
return LineList;
}
//查找数据
int FindData(int *LineList, int n)
{
int i, Data;
printf("请输入查找的数据位置:\n");
scanf("%d",&i);
if (i<1 || i>n)
{
printf("请输入数据在[1,n]之间\n");
return 0;
}
return Data=*(LineList+i-1);
}
//冒泡法排序(稳定排序)
int *BubbleSort(int *LineList, int n)
{
int temp;
for (int i = 0; i < n-1; i++)
{
for(int j = i+1; j < n; j++)
{
if (*(LineList+i) > *(LineList+j))
{
temp = *(LineList+i);
*(LineList+i) = *(LineList+j);
*(LineList+j) = temp;
}
}
}
return LineList;
}
//快速排序算法(不稳定排序)
int *QuickSort(int *LineList, int low, int high)
{
int i, pivotkey,j;
if (low < high)
{
//以第一个元素为基准
pivotkey = *(LineList+low);
i = low;
j = high;
while (i < j)
{
while (i<j && *(LineList+j)>=pivotkey)
{
j--;
}
if (i < j)
{
*(LineList+i) = *(LineList+j);
i++;
}
while(i<j && *(LineList+i)<=pivotkey)
{
i++;
}
if (i<j)
{
*(LineList+j) = *(LineList+i);
j--;
}
}
*(LineList+i) = pivotkey;
QuickSort(LineList, low, i-1);
QuickSort(LineList, i+1,high);
}
return LineList;
}
//简单选择排序算法(不稳定排序)
int *SelectSort(int *LineList, int n)
{
int k, temp;
for(int i = 0; i < n-1; i++)
{
k=i;
for(int j = i+1; j < n; j++)//找到最小值
if(*(LineList+k) > *(LineList+j))
{
k = j;
}
if(k != i)
{
temp = *(LineList+i);
*(LineList+i) = *(LineList+k);
*(LineList+k) = temp;
}
}
return LineList;
}
//直接插入排序(稳定排序)
int *InsertSort(int *LineList, int n)
{
int i,j,temp;
for(i = 1; i < n; i++)
{
temp = *(LineList+i);
j = i-1;
while(j>=0 && temp < *(LineList+j))
{
*(LineList+j+1) = *(LineList+j);
j--;
}
*(LineList+j+1) = temp;
}
return LineList;
}
//希尔排序(不稳定排序)
int *ShellSort(int *LineList, int n)
{
int i,k,j,temp;
for (i = n/2; i > 0; i = i/2)
{
for (j = i; j < n; j++)
{
temp = *(LineList + j);
for (k = j-i; k >= 0 && temp < *(LineList + k); k = k-i)
{
*(LineList + k + i) = *(LineList + k);
}
*(LineList + k + i) = temp;
}
}
return LineList;
}
//堆排序(不稳定排序)
void HeapAdjust(int *LineList, int s, int m)
{
int temp,j;
temp = *(LineList+s);
for (j = 2*s+1; j <= m; j = 2*j+1)
{
if(j<m && *(LineList+j)<*(LineList+j+1))
{
j++;
}
if(!(temp < *(LineList+j)))
{
break;
}
*(LineList+s) = *(LineList+j);
s=j;
}
*(LineList+s) = temp;
}
int *HeapSort(int *LineList, int n)
{
int i,temp;
for(i = n/2-1; i >=0; i--)
{
HeapAdjust(LineList, i, n-1);
}
for(i = n-1; i > 0; i--)
{
temp = *(LineList);
*(LineList) = *(LineList+i);
*(LineList+i) = temp;
HeapAdjust(LineList, 0, i-1);
}
return LineList;
}
望各位志同道合博友相互学习,有问题请指正!