原理如下:每次比较数组中相邻的两个数组元素的值,将较小的数排在较大的数前面,可实现数组元素的从小到大排序;每次将较大的数排在较小的数前面,可实现数组元素从大到小排序。
- /**每次比较数组相邻的两个元素,将大的元素放在前面**/
- //冒泡排序从小到大
- void fun(int arr[],int n) //定义一个数组arr[],次数n;
- {
- int i,j,temp;
- for(i = 0; i < n-1; i++) //比较的次数,
- {
- for(j = 0; j < n-1-i; j++)//每次需要的比较两个相邻元素的次数
- {
- if(arr[j] > arr[j+1])
- {
- temp = arr[j];
- arr[j] = arr[j+1];
- arr[j+1] = temp;
- }
- }
- }
- }
- int main(int argc,char *argv[])
- {
- int i;
- int arr[10];
-
- for(i = 0; i < 10; i++)
- {
- scanf("%d",&arr[i]);
- }
- fun(arr,10);
- for(i = 0; i < 10; i++)
- {
- printf("%d ",arr[i]);
- }
-
- printf("\n");
-
- return 0;
- }
- /**每次比较数组相邻的两个元素,将大的元素放在前面**/
- //冒泡排序从大到小
- void fun1(int arr[],int n) //定义一个数组arr[],次数n;
- {
- int i,j,temp;
- for(i = 0; i < n-1; i++) //比较的次数,
- {
- for(j = 0; j < n-1-i; j++)//每次需要的比较两个相邻元素的次数
- {
- if(arr[j] < arr[j+1])
- {
- temp = arr[j];
- arr[j] = arr[j+1];
- arr[j+1] = temp;
- }
- }
- }
- }
- int main(int argc,char *argv[])
- {
- int i;
- int arr[10];
-
- for(i = 0; i < 10; i++)
- {
- scanf("%d",&arr[i]);
- }
- fun1(arr,10);
- for(i = 0; i < 10; i++)
- {
- printf("%d ",arr[i]);
- }
-
- printf("\n");
-
- return 0;
- }
原理如下:每次在待排序的数组中查找到最大或最小的数组元素,将其值与最前面没有进行过排序的数组元素的值交换;
- #include <stdio.h>
-
- /**选择排序从小到大排序**/
- int main(int argc, char* argv[])
- {
- int i, j=0, temp;
- int arr[5] = { 5,3,4,1,2 };
-
- for (i = 0; i< 4; i++)
- {
- for (j = i + 1; j < 5; j++)
- {
- if (arr[i] > arr[j])
- {
- temp = arr[i];
- arr[i] = arr[j];
- arr[j] = temp;
- }
- }
- }
-
- for (i = 0; i < 5; i++)
- {
- printf("%d ", arr[i]);
- }
- return 0;
- }
原理:从冒泡排序演变来的算法,使用了分治法,
首先确定数组元素第一个位置的元素为基准元素。
第一个元素的位置为L。最后一个元素的位置为R。
先用基准元素从右往左遍历,如果大于就交换,没有大于,R--;
再用基准元素从左往右遍历,如果大于于就交换,没有大于,L++;
最后插入基准值;
在对左右部分重复上述步骤;
- void fun(int arr[],int start,int end)
- {
- if(start >= end)
- {
- return;
- }
- int left = start; //定义一个指向数组第一个元素的指针
- int right = end; //定义一个指向数组最后一个元素的指针
- int pivot = arr[left]; //取出一个基准值,一般为数组第一个值
-
- while(left < right) //左边元素的指针必须小于右边元素的指针
- {
- /**右边放左边**/
- while(arr[right] > pivot && left < right) //如果右边的位置的值大于基准值,并且左边指针小于右边指针
- {
- right--; //直到右边位置的值小于或者等于基准值,不再 -
- }
- if(right > left )
- {
- arr[left] = arr[right];
- left++;
- }
-
- /**左边放右边**/
- while(arr[left] < pivot && left < right)
- {
- left++;
- }
- if(left < right)
- {
- arr[right] = arr[left];
- right--;
- }
- }
- arr[left] = pivot; //将基准值插入中间,现在left 和 right 都指向基准值的指针
- fun(arr,start,left - 1); //重新排序基准左边
- fun(arr,right+1,end); //重新排序基准值右边
- }
-
- int main(int argc,char *argv[])
- {
- int i;
- int arr[5] = {3,1,2,5,4};
-
- fun(arr,0,sizeof(arr)/sizeof(arr[0]));
- for(i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)
- {
- printf("%d ",arr[i]);
- }
- printf("\n");
-
- return 0;
- }