1.冒泡排序
代码
1
void
BubbleSort(
int
arr[] ,
int
len)
2 {
3 for ( int pass = 1 ; pass < len; pass ++ ) // 一共比较len-1轮
4 {
5 for ( int i = 0 ; i < len - pass; i ++ ) // 每轮比较len-pass次
6 {
7 int temp = 0 ;
8 if (arr[i] > arr[i + 1 ]) // 升序就大于,降序就小于
9 {
10 temp = arr[i];
11 arr[i] = arr[i + 1 ];
12 arr[i + 1 ] = temp;
13 }
14 }
15 }
16 }
17
2 {
3 for ( int pass = 1 ; pass < len; pass ++ ) // 一共比较len-1轮
4 {
5 for ( int i = 0 ; i < len - pass; i ++ ) // 每轮比较len-pass次
6 {
7 int temp = 0 ;
8 if (arr[i] > arr[i + 1 ]) // 升序就大于,降序就小于
9 {
10 temp = arr[i];
11 arr[i] = arr[i + 1 ];
12 arr[i + 1 ] = temp;
13 }
14 }
15 }
16 }
17
2.快速排序
快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。一趟快速排序的算法是:1)设置两个变量I、J,排序开始的时候:I=0,J=N-1;
2)以第一个数组元素作为关键数据,赋值给X,即 X=A[0];
3)从J开始向前搜索,即由后开始向前搜索(J=J-1),找到第一个小于X的值a[j];
4)从I开始向后搜索,即由前开始向后搜索(I=I+1),找到第一个大于X的值a[i]; 5) 交换a[i]和a[j]的值;
6)重复第3、4、5步,直到 I=J; (3,4步是在程序中没找到时候j=j-1,i=i+1。找到并交换的时候i, j指针位置不变。另外当i=j这过程一定正好是i+或j+完成的最后另循环结束)
方法1:
代码
1
void
QuickSort(
int
arr[],
int
low,
int
high)
2 {
3 int left = low;
4 int right = high;
5 int pivotKey = arr[low];
6 while (left < right)
7 {
8 while ((left < right) && (arr[right] >= pivotKey)) right -- ;
9 arr[left] = arr[right];
10 while ((left < right) && (arr[left] <= pivotKey)) left ++ ;
11 arr[right] = arr[left];
12 }
13 arr[left] = pivotKey;
14
15 if (left - 1 > low) QuickSort(arr,low,left - 1 );
16 if (left + 1 < high) QuickSort(arr,left + 1 ,high);
17 }
2 {
3 int left = low;
4 int right = high;
5 int pivotKey = arr[low];
6 while (left < right)
7 {
8 while ((left < right) && (arr[right] >= pivotKey)) right -- ;
9 arr[left] = arr[right];
10 while ((left < right) && (arr[left] <= pivotKey)) left ++ ;
11 arr[right] = arr[left];
12 }
13 arr[left] = pivotKey;
14
15 if (left - 1 > low) QuickSort(arr,low,left - 1 );
16 if (left + 1 < high) QuickSort(arr,left + 1 ,high);
17 }
方法2:
代码
1
int
Partition(
int
arr[],
int
low,
int
high)
2 {
3 int pivotKey = arr[low];
4
5 while (low < high)
6 {
7 while ((low < high) && (arr[high] >= pivotKey)) high -- ;
8 arr[low] = arr[high];
9 while ((low < high) && (arr[low] <= pivotKey)) low ++ ;
10 arr[high] = arr[low];
11 }
12 arr[low] = pivotKey;
13 return low;
14 }
15
16 void QuickSort( int arr[], int low, int high)
17 {
18 int pivotLoc = Partition(arr,low,high);
19
20 if (pivotLoc - 1 > low) QuickSort(arr,low,pivotLoc - 1 );
21 if (pivotLoc + 1 < high) QuickSort(arr,pivotLoc + 1 ,high);
22 }
2 {
3 int pivotKey = arr[low];
4
5 while (low < high)
6 {
7 while ((low < high) && (arr[high] >= pivotKey)) high -- ;
8 arr[low] = arr[high];
9 while ((low < high) && (arr[low] <= pivotKey)) low ++ ;
10 arr[high] = arr[low];
11 }
12 arr[low] = pivotKey;
13 return low;
14 }
15
16 void QuickSort( int arr[], int low, int high)
17 {
18 int pivotLoc = Partition(arr,low,high);
19
20 if (pivotLoc - 1 > low) QuickSort(arr,low,pivotLoc - 1 );
21 if (pivotLoc + 1 < high) QuickSort(arr,pivotLoc + 1 ,high);
22 }
3.二分查找
前提:用顺序存储结构的数组
首先,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。
代码
1
int
BinarySearch(
int
arr[],
int
data,
int
length)
2 {
3 int start = 0 ;
4 int end = length - 1 ;
5 while (start <= end)
6 {
7 int middle = (start + end) / 2 ;
8 if (data == arr[middle])
9 {
10 return middle;
11 }
12 else if (data > arr[middle])
13 {
14 start = middle + 1 ;
15 }
16 else
17 {
18 end = middle - 1 ;
19 }
20 }
21
22 return - 1 ;
23 }
2 {
3 int start = 0 ;
4 int end = length - 1 ;
5 while (start <= end)
6 {
7 int middle = (start + end) / 2 ;
8 if (data == arr[middle])
9 {
10 return middle;
11 }
12 else if (data > arr[middle])
13 {
14 start = middle + 1 ;
15 }
16 else
17 {
18 end = middle - 1 ;
19 }
20 }
21
22 return - 1 ;
23 }
递归法:
代码
1
int
BinarySearch(
int
arr[],
int
data,
int
low,
int
high)
2 {
3 int middle = - 1 ;
4 if (low <= high)
5 {
6 middle = (low + high) / 2 ;
7 }
8
9 if (data > arr[middle])
10 {
11 BinarySearch(arr,data,middle + 1 ,high);
12 }
13 else if (data < arr[middle])
14 {
15 BinarySearch(arr,data,low,middle - 1 );
16 }
17 else
18 {
19 return middle;
20 }
21 // return middle;
22 }
2 {
3 int middle = - 1 ;
4 if (low <= high)
5 {
6 middle = (low + high) / 2 ;
7 }
8
9 if (data > arr[middle])
10 {
11 BinarySearch(arr,data,middle + 1 ,high);
12 }
13 else if (data < arr[middle])
14 {
15 BinarySearch(arr,data,low,middle - 1 );
16 }
17 else
18 {
19 return middle;
20 }
21 // return middle;
22 }