以下使用的是冒泡排序法实线数组从小到大排序。
思想:每次相邻两个数比较,若升序,则将大的数放到后面,一次循环过后,就会将最大的数放在最后。
10、2、3、4、5、6、9、8、7、1是输入的待排序的数列,经过第一次排序,将最大的,10放在最后,第二次排序,将剩下的2、3、4、5、6、9、8、7、1进行冒泡,将当前最大的9放在倒数第二的位置,以此类推。
以下是具体代码:
#include <stdio.h>
int main(){
int nums[10] = {10, 2, 3, 4, 5, 6, 9, 8, 7, 1}
int i, j, temp, isSorted
//优化算法:最多进行 n-1 轮比较
for(i=0i<10-1i++){
isSorted = 1 //假设剩下的元素已经排序好了
for(j=0j<10-1-ij++){
if(nums[j] >nums[j+1]){
temp = nums[j]
nums[j] = nums[j+1]
nums[j+1] = temp
isSorted = 0 //一旦需要交换数组元素,就说明剩下的元素没有排序好
}
}
if(isSorted) break//如果没有发生交换,说明剩下的元素已经排序好了
}
for(i=0i<10i++){
printf("%d ", nums[i])
}
printf("\n")
return 0
}
扩展资料:
其他将数组从小到大排序的算法
以下使用的是选择排序法实现数组从小到大排序。
思想:从第一个数开始,每次和后面剩余的数进行比较,若升序,则如果后边的数比当前数字小,进行交换,和后面的所有的数比较、交换后,就会将当前的最小值放在当前的位置
输入的序列为10、2、3、4、5、6、9、8、7、1进行一次排序后将最小的数放在了第一位(a[0]与它后面的所有数进行比较,若a[0]比后面的数大,进行交换),以此类推。
以下是具体代码:
#include <stdio.h>
int main(void){
int a[1001]
int n,i,j,t
scanf("%d",&n)//n为要排序的数的个数
//输入需要排序的数
for(i=0i<n++i)
scanf("%d",a+i)
//接下来进行排序
for(i=0i<n-1++i)//因为每次需要和a[i]后面的数进行比较,所以到a[n-2](倒数第2个元素)就行
{
for(j=i+1j<n++j)//j从i后一个开始,a[i]与a[j]进行比较
{
if(a[i]>a[j])//a[i]为当前值,若是比后面的a[j]大,进行交换
{
t=a[i]
a[i]=a[j]
a[j]=t
}
}//每排序一次,就会将a[i](包括a[i])之后的最小值放在a[i]的位置
for(j=0j<n++j)
printf("%-5d",a[j])
printf("\n\n")
}
return 0
}
可以采用冒泡排序的方法。以下给题主一个对既定数组进行升序、降序排序的代码
#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
}
运行结果
常用的c语言排序算法主要有三种即冒泡法排序、选择法排序、插入法排序。
一、冒泡排序冒泡排序:
是从第一个数开始,依次往后比较,在满足判断条件下进行交换。代码实现(以降序排序为例)
#include<stdio.h>
int main()
{
int array[10] = { 6,9,7,8,5,3,4,0,1,2 }
int temp
for (int i = 0i <10i++)
{//循环次数
for (int j = 0j <10 - i-1j++)
{
if (array[j] <array[j+1])
{//前面一个数比后面的数大时发生交换 temp = array[j]
array[j] = array[j+1]
array[j + 1] = temp
}
}
} //打印数组 for (int i = 0i <10i++) printf("%2d", array[i])return 0}}
二、选择排序以升序排序为例:
就是在指定下标的数组元素往后(指定下标的元素往往是从第一个元素开始,然后依次往后),找出除指定下标元素外的值与指定元素进行对比,满足条件就进行交换。与冒泡排序的区别可以理解为冒泡排序是相邻的两个值对比,而选择排序是遍历数组,找出数组元素与指定的数组元素进行对比。(以升序为例)
#include<stdio.h>
int main()
{
int array[10] = { 6,9,7,8,5,3,4,0,1,2 }
int temp, index
for (int i = 0i <9i++) {
index = i
for (int j = ij <10j++)
{
if (array[j] <array[index])
index = j
}
if(i != index)
{
temp = array[i]
array[i] = array[index]
array[index] = temp
}
for(int i=0i<10:i++)
printf("%2d"array[i])
return 0;
}
三、快速排序
是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
void QuickSort(int* arr, int size)
{
int temp, i, j
for(i = 1i <sizei++)
for(j=ij>0j--)
{
if(arr[j] <arr[j-1])
{
temp = arr[j]
arr[j]=arr[j-1]
arr[j-1]=temp
}
}
}