代码实现:
选择排序
def swap(lyst,i,j):
temp=lyst[i]
lyst[i]=lyst[j]
lyst[j]=temp
def selectionSort(lyst):
i=0
while i<len(lyst)-1:
minIndex=i
j=i+1
while j<len(lyst):
if lyst[j]<lyst[minIndex]:
minIndex=j
j+=1
if minIndex != i:
swap(lyst,minIndex,i)
i+=1
冒泡排序:
def bubbleSort(lyst):
n=len(lyst)
while n>1:
i=1
while i<n:
if lyst[i]<lyst[i-1]:
swap(lyst,i,i-1)
i+=1
n-=1
插入排序:
def insertSort(lyst):
i=1
while i<len(lyst):
itemtoinsert=lyst[i]
j=i-1
while j>=0:
if itemtoinsert<lyst[j]:
lyst[j+1]=lyst[j]
j-=1
else:
break
lyst[j+1]=itemtoinsert
i+=1
希尔排序:是插入排序的一种,是不稳定排序方法。希尔排序是记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
操作步骤:
初始时,有一个大小为 10 的无序序列。
(1)在第一趟排序中,我们不妨设 gap1 = N / 2 = 5,即相隔距离为 5 的元素组成一组,可以分为 5 组。接下来,按照直接插入排序的方法对每个组进行排序。9和4这一组需要互换;1和8这组不需要;…
(2)在第二趟排序中,我们把上次的 gap 缩小一半,即 gap2 = gap1 / 2 = 2 (取整数)。这样每相隔距离为 2 的元素组成一组,可以分为 2 组。按照直接插入排序的方法对每个组进行排序。4和2这一组需要互换;1和3这一组不需要;…
(3)在第三趟排序中,再次把 gap 缩小一半,即gap3 = gap2 / 2 = 1。 这样相隔距离为 1 的元素组成一组,即只有一组。按照直接插入排序的方法对每个组进行排序。此时,排序已经结束。
参考:https://blog.csdn.net/qq845579063/article/details/51447404
堆排序的基本思想是:将待排序序列构造成一个大顶堆(二叉搜索树),此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了。最坏时间复杂度O(nlog(n))
C语言产生随机数并排序:选择排序和冒泡排序的实现
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
#define TRUE 1
#define FALSE 0
#define N 100
#define VALUE_MAX 3000
int *select_sort(int *a)
{
/*选择排序*/
int tmp;
for (int i = 0; i < N; i++)
for (int j = 0; j < i; j++)
{
if (*(a + i) > *(a + j)) {
tmp = *(a + i);
*(a + i) = *(a + j);
*(a + j) = tmp;
}
}
return a;
}
int *sort(int *a)
{
/*冒泡排序*/
int tmp;
for (int i = 0; i<N; i++)
for (int j = 0; j<N-i-1; j++)
{
if (*(a + j)<*(a + j+1)) //<是从大到小。>从小到大
{
tmp = *(a + j);
*(a + j) = *(a + j+1);
*(a + j+1) = tmp;
}
}
return a;
}
int main()
{
system("cls");
int *h;
int a[N];
int i;
srand((unsigned)time(NULL));
for (i = 0; i<N; i++)
{
a[i] = rand() % VALUE_MAX;
}
for (i = 0; i<N; i++) {
printf("%d ", a[i]);
}
printf("\n");
printf("%s\n", "*********************");
//h = select_sort(a);
h = sort(a);
for (i = 0; i<N; i++)
{
printf("%d ", *(h + i));
}
system("pause");
return 0;
}
一个比较全的C语言的排序算法:https://www.cnblogs.com/maluning/p/7944809.html
下边的C语言实现的四个排序算法
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
#define TdInt32 int
#define TdFloat float
#define N 10000
#define VALUE_MAX 30000
#define VALUE_MIN 3
#define print_num 20
TdInt32 creat_random(TdFloat **_value, TdInt32 num)
{
TdFloat *a = NULL;//*a = NULL
TdInt32 RET = 0;
a = (TdFloat *)malloc(sizeof(TdFloat)*N);
srand((unsigned)time(NULL));
for (TdInt32 i = 0; i<N; i++)
{
//a[i] = rand() % VALUE_MAX;
a[i] = VALUE_MIN + 1.0 * rand() / 32767 * (VALUE_MAX - VALUE_MIN);//rand的最大值是32767
}
*_value = a;
return RET;
}
TdInt32 select_sort(TdFloat *a, TdInt32 num)
{
/*选择排序*/
TdFloat tmp;
TdInt32 RET = 0;
TdInt32 i, j;
for (i = 0; i < num; i++)
for (j = 0; j < i; j++)
{
if (*(a + i) > *(a + j)) {
tmp = *(a + i);
*(a + i) = *(a + j);
*(a + j) = tmp;
}
}
return RET;
}
TdInt32 sort(TdFloat *a, TdInt32 num)
{
/*冒泡排序*/
TdFloat tmp;
TdInt32 RET = 0;
TdInt32 i, j;
for (i = 0; i<num; i++)
for (j = 0; j<num -i-1; j++)
{
if (*(a + j)<*(a + j+1)) //<是从大到小。>从小到大
{
tmp = *(a + j);
*(a + j) = *(a + j+1);
*(a + j+1) = tmp;
}
}
return RET;
}
//快速排序
void swap(TdFloat *x, TdFloat *y)
{
TdFloat tmp = *x;
*x = *y;
*y = tmp;
}
TdInt32 patition(TdFloat *a, TdInt32 left, TdInt32 right)
{
TdInt32 j = left; //用来遍历数组
TdInt32 i = j; //小于基准元素的最后一个
TdFloat key = a[right]; //基准元素,把小于等于基准元素的放到左边,大于基准元素的放到右边
for (; j < right; ++j)
{
if (a[j] <= key)
{
swap(&a[j], &a[i]);
i++;//比基准值小,i往后挪一个
}
}
swap(&a[right], &a[i]);//把基准元素放到中间
return i;//返回数组中间位置
}
void quickSort(TdFloat *a, TdInt32 left, TdInt32 right) {
if (left >= right)
return;
TdInt32 mid = patition(a, left, right);
quickSort(a, left, mid - 1);
quickSort(a, mid + 1, right);
}
//插入排序
TdInt32 InsertSort(TdFloat *a, TdInt32 n) {
TdFloat tmp;
TdInt32 RET = 0;
for (TdInt32 i = 1; i < n; i++)
{
TdInt32 j = i - 1;
if (a[i] < a[j]) //每次和它前一个比,如果比前一个小开始交换
{
tmp = a[i];//基准数
a[i] = a[j];
while (tmp < a[j - 1]) //直到tmp找到正确的位置
{
a[j] = a[j - 1];
j--;
}
a[j] = tmp;
}
}
return RET;
}
TdInt32 print_k(TdFloat *a, TdInt32 k, TdInt32 n)
{
TdInt32 RET = 0;
for (TdInt32 i = 0; i < k; i++)
{
printf("%f\n", a[i]);
}
printf("..............................\n");
for (TdInt32 i = n-10; i < n; i++)
{
printf("%f\n", a[i]);
}
return RET;
}
TdInt32 main()
{
while (1)
{
system("cls");
TdInt32 i;
TdInt32 ret = 0;
//TdFloat *a=(TdFloat *)malloc(sizeof(TdFloat)*N);
TdFloat *a=NULL;
ret = creat_random(&a, N); //用一个指针来传
if (ret)
{
printf("生成随机数有误");
break;
}
ret = print_k(a, print_num, N);
if (ret)
{
printf("打印有误");
break;
}
printf("\n");
printf("%s\n", "*********************");
printf(" ____________________________________________________________\n");
printf(" ||----> 请选择排序方式 <----|\n");
printf(" ||----> 1: 冒泡排序 <----|\n");
printf(" ||----> 2: 选择排序 <----|\n");
printf(" ||----> 3: 快速排序 <----|\n");
printf(" ||----> 4: 插入排序 <----|\n");
printf(" ___________________________________________________________|\n");
TdInt32 choice;
printf("请输入你的选择\n");
scanf("%d", &choice);
switch (choice)
{
case 1:
system("cls"); //清屏
ret = sort(a, N);
if (ret)
{
printf(" 排序有误!\n ");
system("pause");
break;
}
break;
case 2:
system("cls"); //清屏
ret = select_sort(a, N);
if (ret)
{
printf(" 排序有误!\n ");
system("pause");
break;
}
break;
case 3:
system("cls"); //清屏
quickSort(a, 0, N - 1);
break;
case 4:
system("cls"); //清屏
ret = InsertSort(a, N);
if (ret)
{
printf(" 排序有误!\n ");
system("pause");
break;
}
break;
default:
system("cls"); //清屏
printf("\n\n");
printf(" 输入有误!\n ");
printf("\n\n");
system("pause");
}
ret = print_k(a, print_num, N);
if (ret)
{
printf("打印有误");
break;
}
system("pause");
return ret;
}
/*
system("cls");
TdInt32 ret=0;
//TdFloat a[N];
TdFloat *a =(TdFloat *)malloc(sizeof(TdFloat)*N);
TdInt32 i;
srand((unsigned)time(NULL));
for (i = 0; i<N; i++)
{
//a[i] = rand() % VALUE_MAX;
a[i] = VALUE_MIN + 1.0 * rand() / 32767 * (VALUE_MAX - VALUE_MIN);//rand的最大值是32767
}
for (i = 0; i<N; i++) {
printf("%f\n", a[i]);
}
printf("\n");
printf("%s\n", "*********************");
//ret=sort(a,N);
if (ret)
{
printf("排序有误");
}
//ret=select_sort(a,N);
if (ret)
{
printf("排序有误");
}
//quickSort(a, 0, N - 1);
ret=InsertSort(a, N);
if (ret)
{
printf("排序有误");
return 0;
}
for (i = 0; i<N; i++)
{
printf("%f\n", *(a + i));
}
system("pause");
return ret;*/
}