线性表创建插入删除及各种排序算法实现

来源:互联网 发布:mysql培训资料 编辑:程序博客网 时间:2024/05/16 11:08

常用排序算法基本思想:

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;}




望各位志同道合博友相互学习,有问题请指正!

原创粉丝点击