一、冒泡排序
基本思想:比较相邻的两个数,如果前者比后者大,则进行交换。每一轮排序结束,选出一个未排序中最大的数放到数组后面。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i, j, num[8] = {0};
printf("please input eight number: ");
for( i = 0; i < 8; i++){
scanf("%d", &num[i]);
}
for( i = 0; i < 8; i++){
printf("%d\t", num[i]);
}
for (j = 7; j > 0; j-- ){
for ( i = 0; i < j; i++){
if ( num [i] > num[i+1] ){
num[i] ^= num[i+1];
num[i+1] ^= num[i];
num[i] ^= num[i+1];
}
}
}
putchar('\n');
for( i = 0; i < 8; i++){
printf("%d\t", num[i]);
}
return 0;
}
#include<stdio.h>
//升级版冒泡排序算法
void bubbleSort_1(int *arr, int n) {
//设置数组左右边界
int left = 0, right = n - 1;
//当左右边界未重合时,进行排序
while (left<=right) {
//从左到右遍历选出最大的数放到数组右边
for (int i =left; i < right; i++)
{
if (arr[i] > arr[i + 1])
{
int temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
--right;
//从右到左遍历选出最小的数放到数组左边
for (int j = right;j> left; j--)
{
if (arr[j] < arr[j-1])
{
int temp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = temp;
}
}
++left;
}
}
int main() {
int arr[] = { 10,54,5,2,3,8,7,4,9,1 };
int n = sizeof(arr) / sizeof(int);
bubbleSort_1(arr, n);
printf("排序后的数组为:\n");
for (int j = 0; j<n; j++)
printf("%d ", arr[j]);
printf("\n");
return 0;
}
二、选择排序
基本思想:依次选出数组最小的数放到数组的前面。首先从数组的第二个元素开始往后遍历,找出最小的数放到第一个位置。再从剩下数组中找出最小的数放到第二个位置。以此类推,直到数组有序
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i, j, num[8] = {0}, max, index;
printf("please input eight number: ");
for( i = 0; i < 8; i++){
scanf("%d", &num[i]);
}
for( i = 0; i < 8; i++){
printf("%d\t", num[i]);
}
for(j = 7; j > 0; j--){
max = 0;
for(i = 0; i <= j; i++)
{
if(max < num[i]){
max = num[i];
index = i;
}
}
/*num[j] ^= num[index];//这方法把相同的数会成0
num[index] ^= num[j];
num[j] ^= num[index];*/
num[index] = num[j];
num[j] = max;
}
putchar('\n');
for( i = 0; i < 8; i++){
printf("%d\t", num[i]);
}
return 0;
}
三、插入排序
基本思想:和交换排序不同的是它不用进行交换操作,而是用一个临时变量存储当前值。当前面的元素比后面大时,先把后面的元素存入临时变量,前面元素的值放到后面元素位置,再到最后把其值插入到合适的数组位置。
#include <stdio.h>
//自定义的输出函数
void print(int a[], int i)
{
printf("%d:\t",i);
for(int j=0; j<8; j++)
{
printf("%d \t",a[j]);
}
printf("\n");
}
//直接插入排序函数
void InsertSort(int a[], int n)
{
for(int i= 1; i<n; i++)
{
if(a[i] < a[i-1])
{//若第 i 个元素大于 i-1 元素则直接插入;反之,需要找到适当的插入位置后在插入。
int j= i-1;
int x = a[i];
while(j>-1 && x < a[j])
{ //采用顺序查找方式找到插入的位置,在查找的同时,将数组中的元素进行后移操作,给插入元素腾出空间
a[j+1] = a[j];
j--;
}
a[j+1] = x; //插入到正确位置
}
print(a,i);//打印每次排序后的结果
}
}
int main()
{
int a[8] = {3,1,7,5,2,4,9,6};
InsertSort(a,8);
return 0;
}
四、快速排序
基本思想:选取一个基准元素,通常为数组最后一个元素(或者第一个元素)。从前向后遍历数组,当遇到小于基准元素的元素时,把它和左边第一个大于基准元素的元素进行交换。在利用分治策略从已经分好的两组中分别进行以上步骤,直到排序完成。下图表示了这个过程。
#include <stdio.h>
#include <stdlib.h>
void swap(int *num1, int *num2){
int temp;
temp = *num1;
*num1 = *num2;
*num2 = temp;
}
int zone(int *a, int left, int right){
int j = left;
int i = j - 1;
int key = a[right];
for(; j < right; j++){
if(a[j] < key){
swap(&a[j], &a[++i]);
}
}
swap(&a[right], &a[++i]);
return i;
}
void quicksort(int *a, int left, int right){
if (left >= right){
return;
}
int mid = zone(a, left, right);
quicksort(a, left, mid - 1);
quicksort(a, mid + 1, right);
}
int main()
{
int i = 0;
int a[12] = {89, 5, 56, 23, 54, 67, 90, 68, 2, 46, 7, 8};
int n = sizeof(a) / sizeof(int);
quicksort(a, 0, n - 1);
printf("排序后数据:");
for(; i < n; i++ ){
printf("%d\t", a[i]);
}
putchar('\n');
return 0;
}