冒泡排序
思想
不断地把最大或最小元素不断冒出来。
如排序5 3 4 9 7 6 2
假如我们用升序的方式,从左边开始扫描,相邻元素两两比较,当左边元素比右边大时就交换,反之,则不用交换。
第一趟循环后的结果为:3 1 5 4 6 7 4 9 这样就把最大的9冒出来了
第二塘循环后的结果为:1 3 4 5 6 4 7 9 这样就把最大的7冒出来了
以此循环,结果如下代码图所示
代码
#include<stdio.h>
void bubbling(int *arr, int N)
{
int flag = 0; //flag判断是否有序,,如果有序,马上退出
for(int i=0; i<N-1; i++)
{
flag = 0;
for(int j=0; j<N-i-1; j++)
if(arr[j] > arr[j+1])
{
flag = 1;
arr[j] ^= arr[j+1];
arr[j+1] ^= arr[j];
arr[j] ^= arr[j+1];
}
/*
for(int t=0; t<N; t++)
printf("%d ", arr[t]);
printf("\n");
*/
if(flag == 0)
return;
}
}
int main(int agrc, char **agrv)
{
int N;
scanf("%d", &N);
int arr[N];
for(int i=0; i<N; i++)
scanf("%d", &arr[i]);
bubbling(arr, N);
for(int i=0; i<N; i++)
printf("%d ", arr[i]);
printf("\n");
return 0;
}
结果如下:
快速排序
思想
快速排序的基本思想是任取待排序序列的一个元素作为中心元素(可以用第一个,最后一个,也可以是中间任何一个),习惯将其称为pivot,枢轴元素;将所有比枢轴元素小的放在其左边;将所有比它大的放在其右边;形成左右两个子表;然后对左右两个子表再按照前面的算法进行排序,直到每个子表的元素只剩下一个。
代码
#include <stdio.h>
int array_num;
void QuickSort(int left, int right, int *quick_sort)
{
int temp, i=left, j=right;
if(left >= right) return ;
temp = quick_sort[i];
while(i < j)
{
while(quick_sort[j]>=temp && i<right) j--;
quick_sort[i] = quick_sort[j];
while(quick_sort[i]<=temp && i<j) i++;
quick_sort[j] = quick_sort[i];
}
quick_sort[i] = temp;
for(int p = 0; p<array_num; p++)
printf("%d ", quick_sort[p]);
printf("\n");
QuickSort(left, i-1, quick_sort);
QuickSort(i+1, right, quick_sort);
}
int main(int agrc, char **agrv)
{
printf("input number:\n");
scanf("%d", &array_num);
int quick_sort[array_num];
for(int j = 0; j < array_num; j++)
scanf("%d", &quick_sort[j]);
QuickSort(0, array_num - 1, quick_sort);
/*
for(int j = 0; j < array_num; j++)
printf("%d ", quick_sort[j]);
printf("\n");
*/
return 0;
}
结果如下: