快速排序C语言实现
快速排序算法c语言实验报告

快速排序算法c语言实验报告冒泡法和选择法排序C程序实验报告实验六:冒泡法排序物理学416班赵增月F12 2011412194日期:2013年10月31日一·实验目的 1.熟练掌握程序编写步骤;2.学习使用冒泡法和选择法排序;3.熟练掌握数组的定义和输入输出方法。
二·实验器材1.电子计算机;2.VC6.0三·实验内容与流程1.流程图(1)冒泡法(2)选择法 2.输入程序如下:(1)冒泡法#includestdio.h void main() { int a[10]; int i,j,t; printf(请输入10个数字:\n); for(i=0;i10;i++)scanf(%d,&a[i]); printf(\n); for(j=0;j9;j++)for(i=0;i9-j;i++) if(a[i]a[i+1]) { t=a[i]; a[i]=a[i+1]; a[i+1]=t; } printf(排序后如下:\n); for(i=0;i10;i++) printf(%d,a[i]); printf(\n); }(2)选择法#includestdio.h void main() { int a[10]; int i,j,t,k; printf(请输入10个数字:\n); for(i=0;i10;i++)scanf(%d,&a[i]);printf(\n); for(i=0;i9;i++) {k=i;for(j=i+1;j10;j++) if (a[k]a[j])k=j;t=a[i];a[i]=a[k];a[k]=t; }printf(排序后如下:\n); for(i=0;i10;i++)printf(%d,a[i]); printf(\n); }四.输出结果(1冒泡法)请输入10个数字:135****2468排序后如下:12345678910 (2)选择法输出结果请输入10个数字:135****6810排序后如下:12345678910五.实验反思与总结1.冒泡法和选择法是一种数组排序的方法,包含两层循环,写循环时,要注意循环变量的变化范围。
C语言实现插入排序、归并排序、堆排序

插入排序、归并排序、堆排序的C实现。
如有疑问请联系QQ:631785485,我们一起学习。
1.插入排序/******************************************Insert_sort.cpp*实现对输入的数进行快速排序******************************************/#include <stdio.h>#include <stdlib.h>#define M 100void Quick_asc(int *a,const int size);void Quick_desc(int *a,const int size);void output(const int *a,const int size);int main(void){int a[]={9,8,7,6,5,4,3,2,1,0};int size;char quit;char c;size=sizeof(a)/sizeof(int);printf("\n************测**********试**************\n");printf("* 排序前:");output(a,size);printf("* 升序:");Quick_asc(a, size);output(a,size);printf("* 降序:");Quick_desc(a, size);output(a,size);printf("********测*****试*****结*****束*********\n\n");/***********************************//***************自输入模块**********//***********************************/do{printf("\n*************************输入************************\n");printf("提示:请输入要排序的数;中间用空格隔开;回车结束输入!\n\n>");int b[M];volatile int i=0;while((0==i || getchar()!='\n')){scanf("%d",&b[i++]);}printf("\n****************************************");printf("\n排序前:");output(b,i);printf("\n升序:");Quick_asc(b,i);output(b,i);printf("\n降序:");Quick_desc(b,i);output(b,i);printf("****************************************\n");printf("\n按任意键继续!Q键退出!\n>");quit=getchar();while(c=getchar()!='\n' && c!=EOF);system("cls");}while(quit!='Q' && 'q'!=quit);return 0;}//end main//自定义输出函数void output(const int *a,const int size){for(int k=0; k<size; k++){printf("%d ",*(a+k));}printf("\n");}//升序排列void Quick_asc(int *a,const int size){int key;int i, j;for(j=1; j<size; j++){key=*(a+j);i=j-1;while(i>=0 && *(a+i)>key){*(a+i+1)=*(a+i);--i;}*(a+i+1)=key;}}//降序排列void Quick_desc(int *a,const int size) {int key;int i, j;for(j=1; j<size; j++){key=*(a+j);i=j-1;while(i>=0 && *(a+i)<key){*(a+i+1)=*(a+i);--i;}*(a+i+1)=key;}}2.归并排序/************************************Merge_sort.cpp*归并排序的实现************************************/#include <stdio.h>#include <stdlib.h>#define M 100void output(const int *a,const int size); void merge(int *a, int p, int q, int r); void merge_sort(int *a, int p1, int r1); int main(){int a[]={9,8,7,6,5,4,3,2,1,0};char c;int size;size=sizeof(a)/sizeof(int);//归并排序printf("*******************归并排序测试*****************\n");printf("排序前:");output(a,size);merge_sort(a,0,size-1);//归并排序函数调用printf("排序后:");output(a,size);/*******************************************自定义输入模块******************************************/while(true){printf("******************************************************\n" );printf("提示:请输入要排序的数;中间用空格隔开;回车结束输入!\n\n>");int b[M];int i=0;while(0==i || (c=getchar())!='\n'){if(!(scanf("%d",&b[i++]))){i=0;printf("输入有误,请重新输入!");system("pause");system("cls");while(c=getchar()!='\n' && c!=EOF);printf("******************************************************\n" );printf("提示:请输入要排序的数;中间用空格隔开;回车结束输入!\n\n>");continue;}}printf("排序前:");output(b,i);printf("排序后:");merge_sort(b,0,i-1);output(b,i);printf("\n******************************************************\ n");printf("按Q退出,任意键继续!\n>");if((c=getchar())=='Q'||c=='q'){exit(0);}else{//清空输入流while(c=getchar()!='\n' && c!=EOF);}system("cls");}return 0;}//end main()void output(const int *a,const int size){for(int k=0; k<size; k++){printf("%d ",*(a+k));}printf("\n");}//归并排序二分void merge_sort(int *a, int p, int r){if(p<r){int q=(p+r)/2;merge_sort(a, p, q);merge_sort(a, q+1, r);merge(a, p, q, r);}}//end merge_sort()//归并排序//a为数的首地址,p为数的起始位置,q二分的位置,r结束的位置。
10个经典的C语言基础算法及代码

10个经典的C语言基础算法及代码1.冒泡排序算法冒泡排序是一种简单但效率较低的排序算法,在每一轮遍历中比较相邻的两个元素,如果顺序不正确则交换它们,直到整个数组有序为止。
```cvoid bubbleSort(int arr[], int n)for (int i = 0; i < n-1; i++)for (int j = 0; j < n-1-i; j++)if (arr[j] > arr[j+1])int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}```2.选择排序算法选择排序是一种简单直观的排序算法,它每次从待排序的数组中选择最小(或最大)的元素,并放到已排序的数组末尾。
```cvoid selectionSort(int arr[], int n)for (int i = 0; i < n-1; i++)int min_index = i;for (int j = i+1; j < n; j++)if (arr[j] < arr[min_index])min_index = j;}}int temp = arr[i];arr[i] = arr[min_index];arr[min_index] = temp;}```3.插入排序算法插入排序的基本思想是将数组分为已排序和未排序两部分,每次将未排序的元素插入到已排序的合适位置。
```cvoid insertionSort(int arr[], int n)for (int i = 1; i < n; i++)int key = arr[i];int j = i - 1;while (j >= 0 && arr[j] > key)arr[j+1] = arr[j];j--;}arr[j+1] = key;}```4.快速排序算法快速排序使用分治法的思想,每次选择一个基准元素,将小于基准的元素放到左边,大于基准的元素放到右边,然后递归地对左右两个子数组进行排序。
c语言中快速排序函数

c语言中快速排序函数快速排序是C语言中最常用的排序算法之一。
它的目标是将一个数组按照从小到大排序。
快速排序本质上是一个递归排序算法,它将一个大问题分解成了许多小问题。
下面,我们将逐步讲解C语言中快速排序函数的实现细节。
1. 算法原理快速排序算法基于分治的思想。
具体来说,它的基本思路是选择一个元素,称为“主元”,然后将数组中小于主元的元素移动到主元左边,大于主元的元素移动到主元右边。
这种分组操作称为“分区”。
随后,在主元左边和右边分别执行递归排序,直到全部元素有序。
2. 算法实现首先,我们应该为快速排序函数提供两个参数:数组名和数组大小。
```cvoid quicksort(int *arr, int size) { ... }```在函数内部,我们需要选择主元以及实现分区。
下面是一个常用的主元选择方法:选取数组中间的元素。
```cint pivot = arr[size/2];```然后,我们需要将数组分为小于主元和大于主元的两部分。
具体来说,我们可以使用两个“指针”,一个指向数组的头部,一个指向尾部。
从头部开始,如果元素比主元小,就向右移动指针;从尾部开始,如果元素比主元大,就向左移动指针。
当两个指针相遇时,整个数组就被分成了两个部分。
```cint left = 0, right = size - 1;while (left <= right) {while (arr[left] < pivot)left++;while (arr[right] > pivot)right--;if (left <= right) {int temp = arr[left];arr[left] = arr[right];arr[right] = temp;left++;right--;}}```最后,我们需要分别对两个部分递归排序。
```cif (right > 0)quicksort(arr, right+1);if (left < size-1)quicksort(&arr[left], size-left);```3. 示例代码为了完整地展示快速排序函数的实现细节,下面是一段完整的示例代码:```c#include <stdio.h>void quicksort(int *arr, int size) {if (size <= 1)return;int pivot = arr[size/2];int left = 0, right = size - 1;while (left <= right) {while (arr[left] < pivot)left++;while (arr[right] > pivot)right--;if (left <= right) {int temp = arr[left];arr[left] = arr[right];arr[right] = temp;left++;right--;}}if (right > 0)quicksort(arr, right+1);if (left < size-1)quicksort(&arr[left], size-left);}int main() {int arr[] = {4, 7, 1, 3, 9, 2, 8, 5, 6};int size = sizeof(arr) / sizeof(int);quicksort(arr, size);printf("Sorted array: ");for (int i = 0; i < size; i++)printf("%d ", arr[i]);printf("\n");return 0;}```4. 总结快速排序是C语言中最常用的排序算法之一。
使用C语言实现12种排序方法

使⽤C语⾔实现12种排序⽅法⽬录1.冒泡排序2.插⼊排序3.折半插⼊排序4.希尔排序5.选择排序6.鸡尾酒排序7.堆排序8.快速排序9.归并排序10.计数排序11.桶排序12.基数排序1.冒泡排序思路:⽐较相邻的两个数字,如果前⼀个数字⼤,那么就交换两个数字,直到有序。
时间复杂度O(n^2),稳定性:这是⼀种稳定的算法。
代码实现:void bubble_sort(int arr[],size_t len){size_t i,j;for(i=0;i<len;i++){bool hasSwap = false; //优化,判断数组是否已经有序,如果有序可以提前退出循环for(j=1;j<len-i;j++){ //这⾥j<len-i是因为最后⾯的肯定都是最⼤的,不需要多进⾏⽐较if(arr[j-1]>arr[j]){ //如果前⼀个⽐后⼀个⼤swap(&arr[j-1],&arr[j]); //交换两个数据hasSwap = true;}}if(!hasSwap){break;}}}2.插⼊排序思路:把⼀个数字插⼊⼀个有序的序列中,使之仍然保持有序,如对于需要我们进⾏排序的数组,我们可以使它的前i个数字有序,然后再插⼊i+1个数字,插⼊到合适的位置使之仍然保持有序,直到所有的数字有序。
时间复杂度:O(n^2) 稳定性:稳定的算法代码实现:void insert_sort(int arr[],int len){int i,j;for(i=1;i<len;i++){int key = arr[i]; //记录当前需要插⼊的数据for(j= i-1;i>=0&&arr[j]>key;j--){ //找到插⼊的位置arr[j+1] = arr[j]; //把需要插⼊的元素后⾯的元素往后移}arr[j+1] = key; //插⼊该元素}}3.折半插⼊排序思路:本质上是插⼊排序,但是通过半分查找法找到插⼊的位置,让效率稍微快⼀点。
c语言快速排序的方法

c语言快速排序的方法快速排序是一种非常高效的排序算法,其基本思想是分治法。
以下是使用C 语言实现快速排序的示例代码:```cinclude <>void swap(int a, int b) {int t = a;a = b;b = t;}int partition(int arr[], int low, int high) {int pivot = arr[high]; // pivot elementint i = (low - 1); // Index of smaller elementfor (int j = low; j <= high- 1; j++) {if (arr[j] < pivot) {i++; // increment index of smaller elementswap(&arr[i], &arr[j]);}}swap(&arr[i + 1], &arr[high]);return (i + 1);}void quickSort(int arr[], int low, int high) {if (low < high) {int pi = partition(arr, low, high); // pi is partitioning index quickSort(arr, low, pi - 1); // Sort elements before piquickSort(arr, pi + 1, high); // Sort elements after pi}}void printArray(int arr[], int size) {int i;for (i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");}int main() {int arr[] = {10, 7, 8, 9, 1, 5};int n = sizeof(arr)/sizeof(arr[0]);quickSort(arr, 0, n-1);printf("Sorted array: \n");printArray(arr, n);return 0;}```在这个示例中,我们首先定义了一个swap函数,用于交换两个元素的值。
c语言实现简单排序(8种方法)

#include<stdio.h>#include<stdlib.h>//冒泡排序voidbubleSort(int data[], int n);//快速排序voidquickSort(int data[], int low, int high); intfindPos(int data[], int low, int high);//插入排序voidbInsertSort(int data[], int n);//希尔排序voidshellSort(int data[], int n);//选择排序voidselectSort(int data[], int n);//堆排序voidheapSort(int data[], int n);void swap(int data[], inti, int j);voidheapAdjust(int data[], inti, int n);//归并排序voidmergeSort(int data[], int first, int last);void merge(int data[], int low, int mid, int high); //基数排序voidradixSort(int data[], int n);intgetNumPos(intnum, intpos);int main() {int data[10] = {43, 65, 4, 23, 6, 98, 2, 65, 7, 79}; inti;printf("原先数组:");for(i=0;i<10;i++) {printf("%d ", data[i]);}printf("\n");/*printf("冒泡排序:");bubleSort(data, 10);for(i=0;i<10;i++) {printf("%d ", data[i]);}printf("\n");printf("快速排序:");quickSort(data, 0, 9);for(i=0;i<10;i++) {printf("%d ", data[i]);}printf("\n");printf("插入排序:");bInsertSort(data,10);for(i=0;i<10;i++) {printf("%d ", data[i]);}printf("\n");printf("希尔排序:");shellSort(data, 10);for(i=0;i<10;i++) {printf("%d ", data[i]);}printf("\n");printf("选择排序:");selectSort(data, 10);for(i=0;i<10;i++) {printf("%d ", data[i]);}printf("\n");int data[11] = {-1, 43, 65, 4, 23, 6, 98, 2, 65, 7, 79}; inti;printf("原先数组:");int data[11] = {-1, 43, 65, 4, 23, 6, 98, 2, 65, 7, 79}; for(i=1;i<11;i++) {printf("%d ", data[i]);}printf("\n");printf(" 堆排序:");heapSort(data, 10);for(i=1;i<11;i++) {printf("%d ", data[i]);}printf("\n");printf("归并排序:");mergeSort(data, 0, 9);for(i=0;i<10;i++) {printf("%d ", data[i]);}printf("\n");*/printf("基数排序:");radixSort(data, 10);for(i=0;i<10;i++) {printf("%d ", data[i]);}printf("\n");return 0;}/*--------------------冒泡排序---------------------*/ voidbubleSort(int data[], int n) {inti,j,temp;//两个for循环,每次取出一个元素跟数组的其他元素比较//将最大的元素排到最后。
快速排序代码

递归算法#include<iostream>using namespace std;#define MAX 100int Partition(int R[],int s, int t){int i=s,j=t;int pivot,tmp1,tmp2; //pivot作为基准值if(s<t){pivot=R[s];while(i!=j) //从区间两端交替向中间扫描,直到i=j为止{while(j>i&&R[j]>pivot) //从右向左扫描,找第1个小于或等于pivot的元素j--;while (j>i&&R[i]<=pivot) //从左向右扫描,找第1个大于pivot的元素i++;if (i<j) //R[i]和R[j]进行交换{tmp1=R[i];R[i]=R[j];R[j]=tmp1;}}}tmp2=R[i]; //pivot和R[i]进行交换R[i]=R[s];R[s]=tmp2;return i;}void QuickSort(int R[],int s, int t){int i=Partition(R,s,t);QuickSort(R,s,i-1); //对左区间递归排序QuickSort(R,i+1,t); //对右区间递归排序}int main(){int R[MAX],m;cin>>m;for(int k=0;k<m;k++)cin>>R[k];int s,t;cout<<"输入s的值:\n";cin>>s;cout<<"输入t的值:\n";cin>>t;QuickSort(R,s,t);for(k=s;k<=t;k++)cout<<R[k]<<" ";cout<<endl;return 0;}非递归算法#include<iostream>using namespace std;#include<stack>#define MAX 100int Partition(int R[],int s, int t){int i=s,j=t;int pivot,tmp1,tmp2; //pivot作为基准值if(s<t){pivot=R[s];while(i!=j) //从区间两端交替向中间扫描,直到i=j为止{while(j>i&&R[j]>pivot) //从右向左扫描,找第1个<=pivot的元素j--;while (j>i&&R[i]<=pivot) //从左向右扫描,找第1个>pivot的元素i++;if (i<j) //R[i]和R[j]进行交换{tmp1=R[i];R[i]=R[j];R[j]=tmp1;}}}tmp2=R[i]; //pivot和R[i]进行交换R[i]=R[s];R[s]=tmp2;return i;}void QuickSort(int R[],int s, int t){stack<int> k;int pivot1=Partition(R,s,t);// 入栈k.push(pivot1+1); // 后半段k.push(t);k.push(s); // 前半段k.push(pivot1-1);while (!k.empty()){t=s.top();s.pop();s=s.top();s.pop();if (s<t){pivot1=Partition(s,t);// 入栈s.push(pivot1+1); // 后半段s.push(t);s.push(s); // 前半段s.push(pivot1-1);}}}int main(){int R[MAX],m;cin>>m;for(int k=0;k<m;k++)cin>>R[k];int s,t;cout<<"输入s的值:\n";cin>>s;cout<<"输入t的值:\n";cin>>t;QuickSort(R,s,t);for(k=s;k<=t;k++)cout<<R[k]<<" ";cout<<endl;return 0;}。