c语言数组的排序

Python015

c语言数组的排序,第1张

可以采用冒泡排序的方法。以下给题主一个对既定数组进行升序、降序排序的代码

#include <stdio.h>

#include <time.h>

#define elemType int /*元素类型*/

#define LEN 100 /*数组长度上限*/

#define ASC 0 /*升序*/

#define DESC 1 /*降序*/

/*冒泡排序*/

/*参数说明:*/

/*elemType arr[]:排序目标数组*/

/*int len:元素个数*/

/*int order:排序方式;升序(由小到大):ASC;降序(由大到小):DESC*/

void bubbleSort (elemType arr[], int len, int order) {

int i, j, temp

for (i = 0 i < len - 1 i++)

for (j = 0 j < len - 1 - i j++) {

if (order == ASC) { /*升序*/

if (arr[j] > arr[j+1]) {

temp = arr[j]

arr[j] = arr[j+1]

arr[j+1] = temp

}

}

else if (order == DESC) { /*降序*/

if (arr[j] < arr[j+1]) {

temp = arr[j]

arr[j] = arr[j+1]

arr[j+1] = temp

}

}

}

}

/*打印数组*/

void printArr (elemType arr[], int len) {

int i

for (i=0 i<len i++)

printf ("%d\t",arr[i])

putchar ('\n')

}

int main (void) {

elemType arr[LEN] = {3,5,1,7,2,9,6,8,10,4}

int len

len = 10

puts ("初始数组:")

printArr (arr,len)

putchar ('\n')

puts ("升序排列:")

bubbleSort (arr, len, ASC) /*升序冒泡排序*/ 

printArr (arr,len)

putchar ('\n')

puts ("降序排列:")

bubbleSort (arr, len, DESC) /*降序冒泡排序*/ 

printArr (arr,len)

putchar ('\n')

getch () /*屏幕暂留*/ 

return 0

}

运行结果

for语句有4个部分内容for ( ABC ) D其中A是初始化语句,每个for只执行A一次,B是循环条件,每次循环前执行判断,如果不满足则结束循环,D是在满足循环条件时执行的,可以是一句或多句(多句时用大括号括起来做整体处理),C是在执行D之后进行的后续处理。for语句执行的顺序是:A,B,D,C,B,D,C,B,D,C,...,B结束

for ( i=0i<9i++ ) {

  iTemp=a[i] iPos=i

  for ( j=i+1j<10j++ ) {

    if ( a[j]<iTemp ) { iTemp=a[j] iPos=i }

  }

  a[iPos]=a[i] a[i]=iTemp

}

假设数组a中输入了十个数为:1,2,5,4,6,8,7,9,10,3,通过手动单步执行程序(把自己当成计算机),分析理解for语句的含义。

i=0[i=0],i<9成立,开始循环

  iTemp=a[i][iTemp=a[0]=1],iPos=i[iPos=0]

  j=i+1[j=0+1=1],j<10成立,开始循环:a[j]<iTemp不成立[a[j]=a[1]=2,2<1不成立],跳过不执行

  j++[j=2],j<10成立,继续循环:a[j]<iTemp不成立[5<1],跳过不执行

  j++[j=3],j<10成立,继续循环:a[j]<iTemp不成立[4<1],跳过不执行

  j++[j=4],j<10成立,继续循环:a[j]<iTemp不成立[6<1],跳过不执行

  ... //没有条件满足让if语句条件能得到执行,因为a[1]~a[9]都不小于iTemp

  j++[j=10],j<10不成立,结束循环

  a[0]=a[0] a[0]=1实际上a[0]值未变,通过以上处理a[0]保存a[0]之后所有数组中最小值

i++[i=1],i<9成立,继续循环

  iTemp=a[i][iTemp=a[1]=2],iPos=i[iPos=1]

  j=i+1[j=2],j<10成立,开始循环:a[j]<iTemp不成立[5<2],跳过不执行

  j++[j=3],j<10成立,继续循环:a[j]<iTemp不成立[4<2],跳过不执行

  ... //没有条件满足让if语句条件能得到执行,因为a[2]~a[9]都不小于iTemp

  j++[j=10],j<10不成立,结束循环

  a[1]=a[1] a[1]=2实际上a[1]值未变,通过以上处理a[1]保存a[1]之后所有数组中最小值

i++[i=2],i<9成立,继续循环

  iTemp=a[i][iTemp=a[2]=5],iPos=i[iPos=2]

  j=i+1[j=3],j<10成立,开始循环:a[j]<iTemp成立,iTemp=a[j][iTemp=4],iPos=j[iPos=3]

  j++[j=4],j<10成立,继续循环:a[j]<iTemp不成立[6<4],跳过不执行

  ...

  j++[j=9],j<10成立,继续循环:a[j]<iTemp成立,,iTemp=a[j][iTemp=3],iPos=j[iPos=9]

  j++[j=10],j<10不成立,结束循环

  a[9]=a[2] a[2]=3通过以上处理a[2]与a[2]之后所有数组中最小值的a[9]值互换

  现在数组变成: 1,2,3,4,6,8,7,9,10,5

...//每次i循环都会导致当前a[i]与之后最小值的元素互换值,结果是a[i]保存之后最小值

i++[i=9],i<9不成立,结束循环  

至此数组按照从小到大顺序排序

上述循环中,i值指定当前要处理的元素,j值负责每次提供之后所有元素下标,在进行比较后,当前i指向元素会与之后最小值进行交换,保证当前元素是之后元素中最小的,从而进行9次这样的处理后数组按顺序已经排好序了。

这样:

int *a = (int *)malloc(sizeof(int) * n)//动态分配数组空间 ,有几个元素,n就是几。

for(i=0i<ni++)

{

a[i]=录入数值

}

Sort(a, n)

for(j=0j<nj++)

{

printf("%d",a[ij)//输出的内容就是排序好了的

}

//下面方法是用来排序的

void Sort(int *a, int n)

{

int i, j, temp

for(i=0i<ni++)

{

for(j=ij<nj++)

{

if(a[i] >a[j])

{

temp = a[i]

a[i] = a[j]

a[j] = temp

}

}

}

扩展资料:

注意事项

1、选择排序法是将序列分为两段,有序前列和无序后列,每次查找无序后列中最大元素,将其插入到有序前列的最末尾处,直至无序后列最后一个元素,最终排序后的序列为降序序列。

2、适用于包括数组和向量在内的序列。

3、选择排序与冒泡排序的区别是选择排序每次遍历时会记住最大元素的位置,只进行一次交换,而冒泡排序每次遍历时会交换两个顺序不合法的元素。

算法程序:

#include "stdafx.h"

#include<iostream>

using namespace std

void SelectSort(int A[],int n)

{

for(int i = 0i <ni++ )

{

int max =i

for(int j = i+1j <nj++) //查找最大元素所在位置

{

if (A[j] >A[max])

max =j

}

int temp = A[max]  //交换无序后列中首元素与最大元素的位置

A[max] = A[i]

A[i] = temp

}

}