您的位置:

顺序表排序算法c语言,c语言的排序算法

本文目录一览:

c语言三种排序

常用的c语言排序算法主要有三种即冒泡法排序、选择法排序、插入法排序。

一、冒泡排序冒泡排序:

是从第一个数开始,依次往后比较,在满足判断条件下进行交换。代码实现(以降序排序为例)

#includestdio.h

int main()

{

int array[10] = { 6,9,7,8,5,3,4,0,1,2 };

int temp;

for (int i = 0; i 10; i++)

{//循环次数

for (int j = 0; j 10 - i-1; j++)

{

if (array[j] array[j+1])

{//前面一个数比后面的数大时发生交换 temp = array[j];

array[j] = array[j+1];

array[j + 1] = temp;

}

}

} //打印数组 for (int i = 0; i 10; i++) printf("%2d", array[i]); return 0;}}

二、选择排序以升序排序为例:

就是在指定下标的数组元素往后(指定下标的元素往往是从第一个元素开始,然后依次往后),找出除指定下标元素外的值与指定元素进行对比,满足条件就进行交换。与冒泡排序的区别可以理解为冒泡排序是相邻的两个值对比,而选择排序是遍历数组,找出数组元素与指定的数组元素进行对比。(以升序为例)

#includestdio.h

int main()

{

int array[10] = { 6,9,7,8,5,3,4,0,1,2 };

int temp, index;

for (int i = 0; i 9; i++) {

index = i;

for (int j = i; j 10; j++)

{

if (array[j] array[index])

index = j;

}

if(i != index)

{

temp = array[i];

array[i] = array[index];

array[index] = temp;

}

for(int i=0;i10:i++)

printf("%2d"array[i])

return 0;

}

三、快速排序

是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

void QuickSort(int* arr, int size)

{

int temp, i, j;

for(i = 1; i size; i++)

for(j=i; j0; j--)

{

if(arr[j] arr[j-1])

{

temp = arr[j];

arr[j]=arr[j-1];

arr[j-1]=temp;

}

}

}

c语言中 顺序表的选择排序是什么?

选择排序(Selection sort)是一种简单直观的排序算法。工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

以下是一个实现选择排序的例子:

1

2

3

4

5

6

7

8

9

10

11

12

13

#define SWAP(x, y, t) ((t) = (x), (x) = (y), (y) = (t))

//将list中的n个数据,通过选择排序算法排序。

void selete_sort(int list[], int n)

{

int i, j, min, temp;

for (i = 0; i n - 1; i++){

min = i;

for (j = i + 1; j n; j++)//找出最小元素的下标。

if (list[j] list[min])

min = j;

SWAP(list[i], list[min], temp);//交换最小元素到当前起始位置。

顺序表的排序,二分法查找的c语言程序

#includestdio.h

int fun(int a[],int n,int key)

{i

nt low,mid,high;//low、mid、high是三个索引分别指向数组的下标low=0;//low指向数组a[]的第一个元素,即下表为0的元素

high=n-1;//lhigh指向数组a[]的最一个元素,即下表为n-1的元素,n为数组的长度

while(low=high)//循环终止条件是lowhigh的时候

{

mid=(low+high)/2;//所谓二分查找就在这里,每次都让mid指向数组下标等于low和high之和的一半的元素i

f(keya[mid])//如果a【mid】大于要查找的元素,说明要查找的元素在low和mid之间,这是需要把high重新置为mid-1

(high=mid-1);//这里应该是{},不能使()吧

else if(keya[mid])//这里同理,如果a【mid】小于要查找的元素,说明要查找的元素在mid和high之间,这是需要把low重新置为mid+1

(low=mid+1);

else

return mid;//剩下的就是相等的情况,直接返回mid就是查找到的结果

}

return -1;//执行到这一步就说明,lowhigh,没有找到要查找的元素,返回-1表示没有结果

}

main()

{

int a[10]={1,2,3,4,5,6,7,8,9,10};

int a,b,c;

b=4;

c=fun(a,10,b);

if(c==1)

printf("not found");

else

printf("psition %d\n",c);

}

C语言顺序表的基本操作

#include stdio.h

#include stdlib.h

typedef int DataType; // 定义数据数据类型

typedef struct {

DataType *data;   // data指向数据区的首个数据

int length;       // 数据长度

}SqList;

void Sort(SqList *L) {

int i,j,k;

DataType tmp;

for(i = 0; i  L-length - 1; ++i) {

k = i;

for(j = i + 1; j  L-length; ++j)

if(L-data[k]  L-data[j])

k = j;

if(k != i) {

tmp = L-data[k];

L-data[k] = L-data[i];

L-data[i] = tmp;

}

}

}

SqList *CreateList(DataType a[],int n) {

int i;

SqList *L;

L = (SqList *)malloc(sizeof(SqList));

L-data = (DataType *)malloc(n * sizeof(DataType));

L-length = n;

for(i = 0; i  n; ++i) L-data[i] = a[i];

Sort(L);

return L;

}

int InsertList(SqList *L,DataType x) {

int i,j;

for (i = 0;i  L-length;i++) {

if(x = L-data[i]) {

for(j = L-length;j = i;j--)

L-data[j + 1] = L-data[j]; // 结点后移

L-data[i] = x;

L-length++;

return 1;

}

}

L-data[L-length++] = x;

return 1;

}

int RemoveListElem(SqList *L,DataType d) {

int i,j;

for(i = 0; i  L-length; ++i) {

if(L-data[i] == d) {

for(j = i; j  L-length - 1; ++j)

L-data[j] = L-data[j + 1];

L-length--;

return 1;

}

}

return 0;

}

SqList *AndList(SqList *A, SqList *B) {   /* A∩B */

int i,j,k = 0;

int len = (A-length  B-length) ? B-length : A-length;

SqList *C = (SqList *)malloc(sizeof(SqList));

C-length = len;

C-data = (DataType *)malloc(len * sizeof(DataType));

for(i = 0; i  A-length; ++i) {

for(j = 0; j  B-length; ++j) {

if(A-data[i] == B-data[j]) {

C-data[k++] = A-data[i];

break;

}

}

}

C-length = k;

return C;

}

SqList *OrList(SqList *A, SqList *B) {   /* A∪B */

int i,j,flag;

DataType e;

SqList *C = (SqList *)malloc(sizeof(SqList));

C-length = A-length + B-length;

C-data = (DataType *)malloc(C-length * sizeof(DataType));

for(i = 0; i  A-length; ++i) C-data[i] = A-data[i];

for(i = 0; i  B-length; ++i) {

e = B-data[i];

flag = 1;

for(j = 0; j  C-length; ++j) {

if(e == C-data[j]) {

flag = 0;

break;

}

}

if(flag) InsertList(C,e);

}

return C;

}

void PrintList(SqList *L) {

int i;

for(i = 0; i  L-length; ++i)

printf("%d ",L-data[i]);

printf("\n");

}

void FreeList(SqList *L) {

free(L-data);

free(L);

}

void main() {

DataType x;

DataType arra[] = {36,24,31,5,90,65,70,39,37};

DataType arrb[] = {9,8,43,51,37,89,33,46,29,80,56};

int alen = sizeof(arra)/sizeof(arra[0]);

int blen = sizeof(arrb)/sizeof(arrb[0]);

SqList *A = CreateList(arra,alen);

printf("A线性表为: ");

PrintList(A);

SqList *B = CreateList(arrb,blen);

printf("B线性表为: ");

PrintList(B);

SqList *C = AndList(A,B);

SqList *D = OrList(A,B);

printf(" C = A∩B: ");

PrintList(C);

printf(" D = A∪B: ");

PrintList(D);

printf("在D表中插入数据 : ");

scanf("%d",x);

InsertList(D,x);

printf("D表插入x后 :");

PrintList(D);

printf("删除D表中数据 : ");

scanf("%d",x);

RemoveListElem(D,x);

printf("删除x后的D表为 :");

PrintList(D);

FreeList(A);

FreeList(B);

FreeList(C);

FreeList(D);

}